InitializingBean
作用和特点
Bean属性都设置完毕后调用afterPropertiesSet()方法做一些初始化的工作
例子
dubbo的ServiceBean暴露服务(export)
DisposableBean
作用和特点
Bean生命周期结束前调用destory()方法做一些收尾工作
例子
dubbo的ServiceBean注销服务(unexport)
BeanNameAware、ApplicationContextAware和BeanFactoryAware
作用和特点
获取beanName,ApplicationContext,BeanFactory
例子
(太常见了,忽略)
FactoryBean
作用和特点
开发者可以个性化地定制自己想要实例化出来的Bean
例子
mybatis的MapperFactoryBean获取mapper接口实例对象
mybatis的SqlSessionFactoryBean通过buildSqlSessionFactory获取sqlSessionFactory实例对象
dubbo的ReferenceBean获取refrence接口实例对象
spring-boot通过PropertiesConfigurationFactory的bindPropertiesToTarget绑定配置属性到对象
BeanPostProcessor
作用和特点
postProcessBeforeInitialization:在初始化Bean之前做一些处理
postProcessAfterInitialization:在初始化Bean之后做一些处理
注意:这两个方法是有返回值的,不要返回null,否则getBean的时候拿不到对象
例子
ConfigurationPropertiesBindingPostProcessor重写postProcessBeforeInitialization绑定Properties属性到@ConfigurationProperties注解的对象
BeanFactoryPostProcessor
作用和特点
Bean创建之前,读取Bean的元属性,并根据自己的需求对元属性进行改变,比如将Bean的scope从singleton改变为prototype
例子
PropertyPlaceholderConfigurer,替换xml文件中的占位符,替换为properties文件中相应的key对应的value
dubbo的AnnotationBean扫描注解
elastic-job的SpringZookeeperRegistryCenter启动基于Zookeeper的注册中心
InstantiationAwareBeanPostProcessor
作用和特点
继承BeanPostProcessor
Bean实例化前后做一些逻辑处理
Bean构造出来之前调用postProcessBeforeInstantiation()方法
Bean构造出来之后调用postProcessAfterInstantiation()方法
填充属性前调用postProcessPropertyValues()方法
spring建议继承InstantiationAwareBeanPostProcessorAdapter,重写相应的方法即可
例子
AutowiredAnnotationBeanPostProcessor通过重写postProcessPropertyValues注入autowired依赖
BeanNameAutoProxyCreator,基于beanName创建代理,就是应用了这个接口,在生成bean前生成代理bean,从而替代默认的实例化。
BeanDefinitionRegistryPostProcessor
作用和特点
继承了BeanFactoryPostProcessor接口
postProcessBeanDefinitionRegistry方法可以修改在BeanDefinitionRegistry接口实现类中注册的任意BeanDefinition
也可以增加和删除BeanDefinition
例子
mybatis中MapperScannerConfigurer在只有接口没有实现类的情况下找到接口方法与sql之间的联系从而生成BeanDefinition并注册
spring的ConfigurationClassPostProcessor将注解@Configuration中的相关生成bean的方法所对应的BeanDefinition进行注册
SmartInitializingSingleton
作用和特点
afterSingletonsInstantiated方法是在非lazy单例Bean实例化完成后的回调方法
例子
EventListenerMethodProcessor注册 @EventListener 注解的方法