1.BeanDefinitionRegistryPostProcessor()

作用和特点
    继承了BeanFactoryPostProcessor接口
    postProcessBeanDefinitionRegistry方法可以修改在BeanDefinitionRegistry接口实现类中注册的任意BeanDefinition
    也可以增加和删除BeanDefinition
例子
    mybatis中MapperScannerConfigurer在只有接口没有实现类的情况下找到接口方法与sql之间的联系从而生成BeanDefinition并注册
    spring的ConfigurationClassPostProcessor将注解@Configuration中的相关生成bean的方法所对应的BeanDefinition进行注册

2.BeanFactoryPostProcessor

作用和特点
    Bean创建之前,读取Bean的元属性,并根据自己的需求对元属性进行改变,比如将Bean的scope从singleton改变为prototype
例子
    PropertyPlaceholderConfigurer,替换xml文件中的占位符,替换为properties文件中相应的key对应的value
    dubbo的AnnotationBean扫描注解
    elastic-job的SpringZookeeperRegistryCenter启动基于Zookeeper的注册中心
3.InstantiationAwareBeanPostProcessor
作用和特点
    继承BeanPostProcessor
    Bean实例化前后做一些逻辑处理
    Bean构造出来之前调用postProcessBeforeInstantiation()方法
    Bean构造出来之后调用postProcessAfterInstantiation()方法
    填充属性前调用postProcessPropertyValues()方法
    spring建议继承InstantiationAwareBeanPostProcessorAdapter,重写相应的方法即可
例子
    AutowiredAnnotationBeanPostProcessor通过重写postProcessPropertyValues注入autowired依赖
    BeanNameAutoProxyCreator,基于beanName创建代理,就是应用了这个接口,在生成bean前生成代理bean,从而替代默认的实例化。

4.
BeanPostProcessor
作用和特点
    postProcessBeforeInitialization:在初始化Bean之前做一些处理
    postProcessAfterInitialization:在初始化Bean之后做一些处理
    注意:这两个方法是有返回值的,不要返回null,否则getBean的时候拿不到对象
例子
    ConfigurationPropertiesBindingPostProcessor重写postProcessBeforeInitialization绑定Properties属性到InitializingBean
作用和特点
    Bean属性都设置完毕后调用afterPropertiesSet()方法做一些初始化的工作
例子
    dubbo的ServiceBean暴露服务(export)

6.
DisposableBean
作用和特点
    Bean生命周期结束前调用destory()方法做一些收尾工作
例子
    dubbo的ServiceBean注销服务(unexport)

7.BeanNameAware、ApplicationContextAware和BeanFactoryAware
作用和特点
    开发者可以个性化地定制自己想要实例化出来的Bean
例子
    mybatis的MapperFactoryBean获取mapper接口实例对象
    mybatis的SqlSessionFactoryBean通过buildSqlSessionFactory获取sqlSessionFactory实例对象
    dubbo的ReferenceBean获取refrence接口实例对象
    spring-boot通过PropertiesConfigurationFactory的bindPropertiesToTarget绑定配置属性到对象

8.FactoryBean
作用和特点
    开发者可以个性化地定制自己想要实例化出来的Bean
例子
    mybatis的MapperFactoryBean获取mapper接口实例对象
    mybatis的SqlSessionFactoryBean通过buildSqlSessionFactory获取sqlSessionFactory实例对象
    dubbo的ReferenceBean获取refrence接口实例对象
    spring-boot通过PropertiesConfigurationFactory的bindPropertiesToTarget绑定配置属性到对象

9.SmartInitializingSingleton
作用和特点
    afterSingletonsInstantiated方法是在非lazy单例Bean实例化完成后的回调方法
例子
    EventListenerMethodProcessor注册 @EventListener 注解的方法

**************************************************************
**************************************************************

spring ioc容器扩展点(1)

一.spring ioc容器常用扩展点

BeanDefinition阶段

1.BeanDefinitionRegistryPostProcessor接口:注册或删除容器中的BeanDefinition对象;例如:通过扫描包,拿到包下面的class,将class实例化成beanDefinition对象,注册进容器

2.BeanFactoryPostProcessor接口:修改BeanDefinition对象;例如:将一个beanDefinition对象的某个String类型的属性a初始值从"11"修改为"1111",scope属性值从singleton修改为prototype

beanDefinition对象-->>spring bean对象,bean实例化阶段(即调用构造方法)

3.InstantiationAwareBeanPostProcessor接口

主要作用: 构造方法前后做一些操作;包含三个方法,构造方法调用之前调用postProcessBeforeInstantiation方法(注:如果此方法能返回bean对象,创建bean对象的流程结束,这个时候返回的bean对象可能是一个代理对象);构造方法调用之后调用postProcessAfterInstantiation方法,返回值true/false决定要不要调用postProcessProperties方法;填充属性前调用postProcessProperties方法

bean初始化阶段(即构造方法之后,赋值的阶段,调用set方法,设置bean对象的属性)

4.BeanPostProcessor接口

主要作用:赋值方法前后做一些操作;包含两个方法,4.1赋值方法之前调用postProcessBeforeInitialization方法(返回值不能返回null,否则getBean的时候拿不到对象) 

5.Aware类型的感知接口,BeanNameAware/BeanFactoryAware/BenClassLoaderAware(注:有且只有这三个),通过instanceof判断类型,然后set相应值;剩下的这些像EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationContextAware是ApplicationContextAwareProcessor处理的,原理也一样,instanceof判断类型

6.InitializingBean接口:bean属性都设置完毕后调用afterPropertiesSet方法做一些初始化的工作

4.2赋值方法之后调用postProcessAfterInitialization(返回值不能返回null,否则getBean的时候拿不到对象)

7.SmartInitializingSingleton接口

主要作用:非lazy单例Bean实例化完成后的回调方法afterSingletonsInstantiated方法;如@EventListener 注解原理就是其实现类EventListenerMethodProcessor,在bean对象初始化完成之后,查找方法上面有没有注解,有的话,将对应方法封装成一个监听器,注册到广播器上面

bean的销毁阶段

8.DisposableBean接口:当容器关闭的时候,调用其destroy方法执行销毁,做一些收尾工作,如释放数据库连接资源等

二.bean的生命周期

创建过程:

InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation()

>>bean自身的构造方法

>>InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation()

>>BeanPostProcessor#postProcessBeforeInitialization()

>>带有@PostConstruct注解的方法

>>InitializingBean#afterPropertiesSet()

>>initMethod()

>>BeanPostProcessor#postProcessAfterInitialization()

>>SmartInitializingSingleton#afterSingletonsInstantiated()

销毁过程:

带有@PreDestroy注解的方法

>>DisposableBean.destroy()

>>destroyMethod()

注:上面创建和销毁的方法,除了initMethod()和destroyMethod(),都可以不至一个,如多个@PostConstruct方法、@PreDestroy方法

spring ioc容器扩展点(2)

坚持简单一点 2020-05-24 19:08:27

一.FactoryBean的扩展

主要作用:不方便直接从容器中获取的对象,可以通过FactoryBean对象包装一下再返回;

getObject 方法返回处理后的对象;如mybatis中MapperFactoryBean根据接口类型取mapper对象

如PayFactoryBean取到容器中某一类型的所有对象,根据参数值筛选出合适对象来执行方法


根据参数值筛选出合适对象来执行方法

二.监听相关的扩展

1.ApplicationEventMulticaster广播器接口(SimpleApplicationEventMulticaster)

主要作用:绑定或解除绑定监听者、发布事件给监听者;容器优先使用自定义广播器,没有再创建默认的;即便使用默认的广播器,也可以自定义实现Executor接口,自定义实现ErrorHandler接口进行扩展

2.ApplicationEvent事件抽象类(默认提供5种),可以通过继承的方式,实现自己的事件

3.自定义监听器ApplicationListener,(如果没有手动注册到广播器上面,ApplicationListenerDetector后置处理器会自动探测并注册到广播器)

4.发布事件,只要能取到容器,就可以发布任意事件,context.publishEvent(new MyEvent());

三.MergedBeanDefinitionPostProcessor

每个Bean的创建需要的是一个MergedBeanDefinition(基于原始BeanDefinition及其双亲BeanDefinition信息得到一个"合并"之后的BeanDefinition);bean创建过程中,MergedBeanDefinition生成之后,对象属性填充之前,对该bean和MergedBeanDefinition做一次回调操作,相当于提供一个机会可以修改,如注解@Autowired的原理就是其实现类AutowiredAnnotationBeanPostProcessor

四.SmartInstantiationAwareBeanPostProcessor

三个接口方法:Class<?> predictBeanType(Class<?> beanClass, String beanName)//用来返回目标对象的类型;

Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName)//用来返回实例化的构造器;

Object getEarlyBeanReference(Object bean, String beanName)//用来返回提前暴露的bean的引用,用来支持单例对象的循环引用;

如果对象A和B两个bean产生循环依赖时,会调用getEarlyBeanReference方法去提前暴露出来的A对象,默认是直接返回填充属性前的对象A,重写方法,返回了对象A*(可以按照需要返回相应的对象,比如先填充属性值、代理对象等)

五.LifecycleProcessor

主要作用:生命周期执行器,对象的start开始、stop结束的时候执行逻辑,相当于监听器的广播者,每个实现Lifecycle接口的对象类似于监听者,广播者统一调度监听者;如果不自定义LifecycleProcessor实现类,默认DefaultLifecycleProcessor,利用生命周期执行器可以实现优雅的开关机