1、BeanFactoryPostProcessor
BeanFactory后置处理器,是对BeanDefinition对象进行修改
2、BeanDefinitionRegistryPostProcessor bean定义注册处理器
BeanFactoryPostProcessor 的子接口,也是对BeanDefinition对象进行修改
3、BeanPostProcessor
bean后置处理器,在bean初始化之前和之后对bean对象进行修改
4、InstantiationAwareBeanPostProcessor
bean实例化之前和之后处理
这四种处理器在bean生命周期中都有着重要的作用
5、SmartInitializingSingleton
这个不参与bean的生命周期,是bean所有实例都生成之后,对bean做一些后置处理
BeanFactoryPostProcessor
public interface BeanFactoryPostProcessor { void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException; }
Spring允许BeanFactoryPostProcessor在容器实例化任何其它bean之前读取配置元数据,并可以根据需要进行修改,例如可以把bean的scope从singleton改为prototype,也可以把property的值给修改掉。可以同时配置多个BeanFactoryPostProcessor,并通过设置’order’属性来控制各个BeanFactoryPostProcessor的执行次序。
如PropertySourcesPlaceholderConfigurer,它用于解析bean
定义中的属性值,以及注解@Value
的值,使用的属性来源是当前的Spring Environment
对象
BeanDefinitionRegistryPostProcessor
public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor { void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException; }
BeanFactoryPostProcessor的子接口,BeanFactoryPostProcessor的作用是在bean的定义信息已经加载但还没有初始化的时候执行方法postProcessBeanFactory()方法,而BeanDefinitionRegistryPostProcessor是在BeanFactoryPostProcessor的前面执行。
如ConfigurationClassPostProcessor,用来注册ComponentScan扫描出来的bean类
BeanPostProcessor
public interface BeanPostProcessor {
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException; Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException; }
在bean实例的初始化方法回调之前调用BeanPostProcessor的postProcessBeforeInitialization的方法,在bean实例的初始化方法回调之后调用BeanPostProcessor的postProcessAfterInitialization的方法
InstantiationAwareBeanPostProcessor
public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor { //该方法的返回值类型是Object,我们可以返回任何类型的值。由于这个时候目标对象还未实例化,所以这个返回值可以用来代替原本该生成的目标对象的实例(比如代理对象)。 //如果该方法的返回值代替原本该生成的目标对象,后续只有postProcessAfterInitialization方法会调用,其它方法不再调用;否则按照正常的流程走 Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException;
//在目标对象实例化之后调用,这个时候对象已经被实例化,但是该实例的属性还未被设置,都是null。因为它的返回值是决定要不要调用postProcessPropertyValues方法的其中一个因素(因为还有一个因素是mbd.getDependencyCheck()); //如果该方法返回false,并且不需要check,那么postProcessPropertyValues就会被忽略不执行;如果返回true,postProcessPropertyValues就会被执行 boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException;
//属性值进行修改,如果postProcessAfterInstantiation方法返回false,该方法可能不会被调用。可以在该方法内对属性值进行修改 PropertyValues postProcessPropertyValues( PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException; }
InstantiationAwareBeanPostProcessor接口是BeanPostProcessor的子接口,是在bean实例化之前和之后调用,BeanPostProcessor 是在初始化之前和之后调用
postProcessAfterInstantiation在实例化之前调用
postProcessAfterInstantiation会在实例化之后,依赖注入和初始化方法之前。注册多个接口只要其中一个返回false,即停止后续执行。如果不想使用spring的自动注入(前提是已经使用了@Autowired注解),则对于特殊的bean则可以注册一个InstantiationAwareBeanPostProcessor使其不进行注入,使用自己的方式进行注入。
SmartInitializingSingleton
实现SmartInitializingSingleton的接口后,当所有单例 bean 都初始化完成以后, Spring的IOC容器会回调该接口的 afterSingletonsInstantiated()
方法。
主要应用场合就是在所有单例 bean 创建完成之后,可以在该回调中做一些事情