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
@Overrideprotected String[] selectImports(AdviceMode adviceMode) {switch (adviceMode) {case PROXY:// 向 Spring 中添加了 AutoProxyRegistrar 和 ProxyTransactionManagementConfiguration 两个 beanreturn new String[] {AutoProxyRegistrar.class.getName(),ProxyTransactionManagementConfiguration.class.getName()};case ASPECTJ:return new String[] {determineTransactionAspectClass()};default:return null;}}
实现了 ImportBeanDefinitionRegistrar 接口的类
ImportBeanDefinitionRegistrar类只能通过其他类@Import的方式来加载,通常是启动类或配置类- 该类拥有注册 bean 的能力
@Overridepublic 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 都实例化完成以后会调用一次
