Spring学习理解之-后置处理器
spring后置处理器有几种?后置处理器的作用
后置处理器有两种:
(1)bean的后置处理器:这种处理器会对容器中的bean进行后处理,对bean进行增强
(2)容器的后置处理器:针对IOC容器的后处理,对容器功能增强
1、bean后置处理器
Bean后置处理器是一种特殊的bean,主要负责容器中的其他bean执行后处理 ,如代理类的生成等,这种bean被称为bean后置处理器。它会在bean创建成功后对bean进行增强处理。bean后置处理器必须实现BeanPostProcessor接口,同时实现两个方法:
(1)postProcessorBeforeInitializtion(Object obj,String name);前置处理,第一个参数系统将进行后置处理的bean对像,第二参数该bean的配置id。
(2)postProcessorAfterInitializion(Object obj,String name);
bean后置处理器在容器中注册后,会自动启动,容器中的每个bean在创建时会自动执行后置处理器,Bean后置处理器两个方法执行回调的时机如下图:
在bean注入依赖关系之后,bean初始化过程中,进行回调BeanPostProcess接口的postProcessBeforeInitialization和postProcessAfterInitialization两个方法,对bean进行增强。
了解spring中bean的初始化过程如下:
容器启动
----->收集BeanDefinition(解析xml定义的bean信息)
----->实例化之前可以对bean做一些启动动作(spring提供了InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation进行扩展)
----->根据加载的BeanDefinition信息通过反射实例化bean
----->实例化首先判断是否设置了super对象,如果有则调用super的get得到父类对象,根据BeanDefinition的信息确认bean实例化的方式通过工厂bean进行实例化或构造方法
----->实例化后赋值之前MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition()进行加工(扩展)
----->为对象属性赋值
----->赋值后也有扩展点InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation()
----->进行依赖注入(循环依赖)
----->处理属性如:@Autowired @Resource@value等注解,通过上面的扩展点实现
----->完成属性赋值后spring执行回调
----->进行初识化,初始化之前提供了扩展点:BeanPostProcessor.postProcessorBeforeInitialization方法,可以对完成依赖注入的bean进行增强处理
----->初始化,查看是否实现初始化方法,调用初始化方法
----->初始化后spring提供了扩展点:BeanPostProcessor.postProcessorAfterInitialization方法进行扩展,可以bean进行最终的增强处理。
总结:Spring中的Aop就是基于初始化后实现的,初始化后返回的对象才是最终的对象。
注意一点如果使用BeanFactory作为spring容器,必须手动注册bean后置处理器才能生效。
(2)容器后置处理器
容器后置处理负责容器本身的后置处理,必须实现BeanFactoryPostProcessor接口,并实现方法postProcessorBeanFactory(ConfigurableListableBeanFactory beanFactory)对容器进行扩展
总结:spring后置处理器为使用者提供很大的帮助,为程序后续扩展奠定了基础,让开发任务可以进行自定义扩展,在对象的初始化前后进行扩展处理,体现出spring的扩展性非常强。后置处理器作用就是对原有对象的增强,提高系统扩展性。