一、容纳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的执行次序。