博客
关于我
Spring里面的ioc拓展
阅读量:355 次
发布时间:2019-03-04

本文共 4079 字,大约阅读时间需要 13 分钟。

在常用的一些spring ioc配置中,对于bean的依赖注入是常规项目中最常见功能了。除此之外,Spring还提供有一些比较灵活的功能点用于对Spring容器里面的组件进行扩充和操作。

 

IOC

  1. Bean定义的定位,Bean 可能定义在XML中,或者一个注解,或者其他形式。这些都被用Resource来定位, 读取Resource获取BeanDefinition 注册到 Bean定义注册表中。

  2. 第一次向容器getBean操作会触发Bean的创建过程,实列化一个Bean时 ,根据BeanDefinition中类信息等实列化Bean.

  3. 将实列化的Bean放到单列Bean缓存内.

  4. 此后再次获取向容器getBean就会从缓存中获取

  5. ioc容器本质就是一个map结构

Spring IOC :

对于ioc容器的一些处理器

 

BeanDefinitionRegistryPostProcessor

BeanDefinitionRegistryPostProcessor主要功能时提供给开发人员在对bean注入ioc容器之前进行额外操作的一个处理器。例如一些比较特殊的bean需要手动注入到spring的ioc容器里面去的时候,可以采用这个处理器来进行统一注入。

PS:下列代码均是在springboot 2.0环境下运行的

package com.sise.config;import com.sise.annotation.MyBean;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;import org.springframework.beans.factory.support.BeanDefinitionRegistry;import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;import org.springframework.context.annotation.ClassPathBeanDefinitionScanner;import org.springframework.core.type.filter.AnnotationTypeFilter;import org.springframework.stereotype.Component;/** * 手动设置注入相应的bean到ioc容器里边 * * @author idea * @data 2019/3/18 */@Componentpublic class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {    @Override    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {        System.out.println("动态加载bean进入ioc容器里面");        ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(registry);        //扫描所有包含指定注解的bean加入到ioc里面        scanner.addIncludeFilter(new AnnotationTypeFilter(MyBean.class));        scanner.scan("com.sise.bean");    }    @Override    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {    }}

BeanFactoryPostProcessor 

BeanFactoryPostProcessor 则是一个专门用于对bean做加入ioc容器之前进行处理的一个处理器,例如说一些bean注入的校验,初始化操作。

package com.sise.config;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanFactoryPostProcessor;import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;import org.springframework.stereotype.Component;/** * 在加入ioc容器之前,对bean做处理 * * @author idea * @data 2019/3/18 */@Componentpublic class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {    @Override    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {        System.out.println("在加入ioc容器之前需要进行的处理");        String[] beanNameArr = beanFactory.getBeanDefinitionNames();        for (String name : beanNameArr) {            //这里的name是采用驼峰式命名的规则            if (name.equals("user")) {                //这里面可以做一些对于bean加载时候所需要进行的限制操作                System.out.println("加载了user类对象");            }        }    }}

 

BeanPostProcessor

BeanPostProcessor是专门处理已经注入ioc容器里面的bean的初始化之前和初始化之后相关操作的一款处理器。例如说对于某个带有特定注解的类,在进行初始化之后,需要对相应的属性进行额外处理

package com.sise.config;import com.sise.annotation.MyBean;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanPostProcessor;import org.springframework.stereotype.Component;/** * 在每个ioc容器里面的bean被初始化之前和初始化之后 * * @author idea * @data 2019/3/18 */@Componentpublic class MyBeanPostProcessor implements BeanPostProcessor {    @Override    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {        if (bean.getClass().getAnnotation(MyBean.class) != null) {            System.out.println("beanName:" + beanName);        }        return bean;    }    @Override    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {        if (bean.getClass().getAnnotation(MyBean.class) != null) {            System.out.println("beanName:" + beanName);        }        return bean;    }}

BeanPostProcessorBeanFactoryPostProcessor 的功能有点类似,但是BeanFactoryPostProcessor 更多的是处理在加入ioc容器之前的操作,BeanPostProcessor则是处理加入ioc容器之后,bean初始化前后的操作。

结合Spring容器里面的这些ioc扩展功能,随着整体项目业务的变化,开发者可以进行一些灵活的变迁操作。例如说在一些bean进行初始化加载的时候做一些限制操作,又或者说在一些基本的bean装载过程中做一定的拦截操作。

 

转载地址:http://yzte.baihongyu.com/

你可能感兴趣的文章
mysql中kill掉所有锁表的进程
查看>>
mysql中like % %模糊查询
查看>>
MySql中mvcc学习记录
查看>>
mysql中null和空字符串的区别与问题!
查看>>
MySQL中ON DUPLICATE KEY UPDATE的介绍与使用、批量更新、存在即更新不存在则插入
查看>>
MYSQL中TINYINT的取值范围
查看>>
MySQL中UPDATE语句的神奇技巧,让你操作数据库如虎添翼!
查看>>
Mysql中varchar类型数字排序不对踩坑记录
查看>>
MySQL中一条SQL语句到底是如何执行的呢?
查看>>
MySQL中你必须知道的10件事,1.5万字!
查看>>
MySQL中使用IN()查询到底走不走索引?
查看>>
Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
查看>>
MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
查看>>
mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
查看>>
mysql中出现Unit mysql.service could not be found 的解决方法
查看>>
mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
查看>>
Mysql中各类锁的机制图文详细解析(全)
查看>>
MySQL中地理位置数据扩展geometry的使用心得
查看>>
Mysql中存储引擎简介、修改、查询、选择
查看>>
Mysql中存储过程、存储函数、自定义函数、变量、流程控制语句、光标/游标、定义条件和处理程序的使用示例
查看>>