Spring4-bean生命周期-3-【Bean】的理解和【统一处理器 】BeanPostProcessor接口

一、容纳Bean

   使用spring应用上下文

 FileSystemXmlApplicationContext:指定文件路径下寻找xml
 ClassPathXmlApplicationContext:所有类路径下(包含jar文件)下查询xml 
 AnnotationConfigApplicationContext:注解的spring容器加载方式
 ApplicationContext context = new ClassPathXmlApplicationContext("xx.xml")

   获取到bean

 getBean()

二、Bean的生命周期

实例化:spring对bean进行实例化
填充属性:spring将值和Bean的引用注入到Bean对应属性
调用BeanNameAware的setBeanName():如果Bean实现了该接口,Spring将Bean的ID传递给setBeanName()
调用BeanFactoryAware的setBeanFactory():如果Bean实现了该接口,Spring将BeanFactory容器实例传入
调用ApplicationContextAware的setApplicationContext():如果Bean实现了该接口,Spring将bean所在的上下文引用传入
调用BeanPostProcessor的预初始化方法:Spring调用他们的postProcessorBeforeInitlization()
调用InitializingBean的afterPropertiesSet():Spring调用他们的afterPropertiesSet().类似的bean使用init-method,该方法被调用
调用自定义的初始化方法 
调用BeanPostProcessor的初始化方法 :Spring调用他们的postProcessorAfterInitlization()
bean使用
容器关闭
调用DisposableBean的destroy()
调用自定义的销毁方法

三、bean接口

     作用:BeanPostProcessor也称为Bean后置处理器,它是Spring中定义的接口,在Spring容器的创建过程中(具体为Bean初始化前后)会回调BeanPostProcessor中定义的两个方法。

public interface BeanPostProcessor {
        //每一个bean对象的初始化方法调用之前回调
        Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
        //每一个bean对象的初始化方法调用之后被回调
    	Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
} 

四、使用

   实现了BeanPostProcessor接口,在spring 容器中注册bean后,会自动应用在容器中。在所有Bean实例化之后进行前后作用。

这里很重要,是他和BeanFactoryPostProcess的本质区别。

 五、BeanPostProcessor --- 又被称为 :统一处理器 的作用

  • Spring在IOC容器完成bean的实例化、配置和初始化后可以通过BeanPostProcessor(后处理器)对创建的bean进行各种处理。你可以在这里修改bean的属性或者增强bean,spring AOP创建jdk代理或者cglib代理的过程就是在BeanPostProcessor(后处理器)中实现的。因此我将Spring AOP 技术看做是:Spring AOP = BeanPostProcessor + 代理。
  • BeanPostProcessor的作用域范围是容器级的。它只和你所使用的容器有关。如果你在容器中定义一个实现了BeanPostProcessor的类,它仅仅对此容器中的bean进行后置处理。
  • 如果配置了多个BeanPostProcessor,那么可以通过实现Ordered接口设置'order'属性来控制BeanPostProcessor的执行次序。
     

 

 

你可能感兴趣的:(Spring学习和理解)