BeanPostProcessor 的各类型执行时机
1、实例化之前:InstantiationAwareBeanPostProcessor
【执行时机】:实例化之前执行
【调用方法】:Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName)
【使用场景】:不希望由 Spring 来实例化对象,在 Spring 实例化之前,由自己实例化对象
【注意事项】:一旦返回自己创建的 bean,那么 Spring 就会直接返回该 bean
2、初始化之前:BeanPostProcessor.postProcessBeforeInitialization
【执行时机】:初始化之前执行
【调用方法】:default Object postProcessBeforeInitialization(Object bean, String beanName)
【注意事项】:只有返回了对象,才会继续执行其他的 BPP 的 postProcessBeforeInitialization
方法,否则会直接结束循环
3、初始化之后:BeanPostProcessor.postProcessAfterInitialization
【执行时机】:初始化之后执行
【调用方法】:default Object postProcessAfterInitialization(Object bean, String beanName)
【注意事项】:只有返回了对象,才会继续执行其他的 BPP 的 postProcessAfterInitialization
方法,否则会直接结束循环
@Import 注解的扩展
实现了 ImportSelector 接口的类
【使用方式】:集成这个 ImportSelector
接口,在 selectImports
方法中返回类的全限定名,即可向 Spring 容器中注册 bean
@Override
protected String[] selectImports(AdviceMode adviceMode) {
switch (adviceMode) {
case PROXY:
// 向 Spring 中添加了 AutoProxyRegistrar 和 ProxyTransactionManagementConfiguration 两个 bean
return new String[] {AutoProxyRegistrar.class.getName(),
ProxyTransactionManagementConfiguration.class.getName()};
case ASPECTJ:
return new String[] {determineTransactionAspectClass()};
default:
return null;
}
}
实现了 ImportBeanDefinitionRegistrar 接口的类
ImportBeanDefinitionRegistrar
类只能通过其他类@Import
的方式来加载,通常是启动类或配置类- 该类拥有注册 bean 的能力
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
BeanDefinitionRegistry registry) {
registry.registerBeanDefinition(beanName, beanDefinition);
}
普通类
如果 @Import 中指定的是一个普通类,那么就会直接注册到 Spring 容器中去
InitializingBean 接口
afterPropertiesSet()
当继承了 InitializingBean
接口的 bean 的属性被初始化后,会调用 afterPropertiesSet
方法
【执行时机】:Constructor > @PostConstruct > InitializingBean > init-method
DisposableBean 接口
destroy()
当继承了 DisposableBean
接口的 bean 的属性被初始化后,会调用 destroy
方法
【执行时机】:@PreDestory > DisposableBean > destory-method
SmartInitializingSingleton 接口
afterSingletonsInstantiated()
当所有单例 bean 都实例化完成以后会调用一次