spring源码解析-IOC容器的基本实现( 三 )


实现了这些接口的Bean会切入到多个Bean的生命周期中 。因此,这些接口的功能非常强大,Spring内部扩展也经常使用这些接口,例如自动注入以及AOP的实现都和他们有关 。
 
1 BeanPostProcessor 作用于初始化阶段的前后
2
InstantiationAwareBeanPostProcessor 作用于实例化阶段的前后,
 
这两兄弟可能是Spring扩展中最重要的两个接口!
工厂后处理器接口方法:包含了AspectJWeavingEnabler、
ConfigurationClassPostProcessor、CustomAutowreConfigure等非常有用的工厂后处理器接口的方法,会在应用上下文装配配置文件后立即调用 。

  • 第二大类:Bean级别生命周期接口方法(每个 bean调用一次的接口)
1 Aware类型的接口
2 Bean生命周期接口 包含了BeanNameAware、BeanFactoryAware、initialzingBean和DiposableBean这些接口的方法
3 Bean的自身方法: 这个包括了init-method和destory-method方法
【spring源码解析-IOC容器的基本实现】 
Aware类型的接口的作用就是让我们能够拿到Spring容器中的一些资源 。
基本都能够见名知意,Aware之前的名字就是可以拿到什么资源,例如BeanNameAware可以拿到BeanName,以此类推 。
调用时机需要注意:所有的Aware方法都是在初始化阶段之前调用的!
  • 各个接口调用时机演示
//1 BeanFactoryPostProcessor 工厂后处理器接口@Componentpublic class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {public CustomBeanFactoryPostProcessor() {System.out.println("==[BeanFactoryPostProcessor 接口]调用了 CustomBeanFactoryPostProcessor 构造器");}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {System.out.println("==[BeanFactoryPostProcessor 接口]调用了 CustomBeanFactoryPostProcessor.postProcessBeanFactory() 修改bean定义");//BeanDefinition beanDefinition = beanFactory.getBeanDefinition("person");//beanDefinition.setScope(BeanDefinition.SCOPE_PROTOTYPE);beanFactory.registerSingleton("newobjr",new Object());}}// 2 BeanPostProcessor bean处理器@Componentpublic class CustomBeanPostProcessor implements BeanPostProcessor {public CustomBeanPostProcessor() {System.out.println("==[BeanPostProcessor 接口]调用了 CustomBeanPostProcessor 构造器");}@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("==4 [BeanPostProcessor 接口]调用了 "+beanName+".postProcessBeforeInitialization()");return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("==6 [BeanPostProcessor 接口]调用了 "+beanName+".postProcessAfterInitialization()");return bean;}}// 3Bean级别生命周期接口方法@Componentpublic class Person implements BeanFactoryAware, BeanNameAware, InitializingBean, DisposableBean {public Person() {System.out.println("==1 [Person]调用了构造器,进行对象实例化");}@Overridepublic void setBeanName(String s) {System.out.println("==2 [BeanNameAware 接口]调用了 BeanNameAware.setBeanName()");}@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {System.out.println("==3 [BeanFactoryAware 接口]调用了 BeanFactoryAware.setBeanFactory()");}//==4 BeanPostProcessor.postProcessBeforeInitialization()...@PostConstruct//@PostConstruct是一种 BeanPostProcessorpublic void demo() {System.out.println("==5.1 [@PostConstruct]调用了 Person.demo()");}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("==5.2 [InitializingBean 接口]调用了 InitializingBean.afterPropertiesSet()");}//==6 BeanPostProcessor.postProcessAfterInitialization()...@Overridepublic void destroy() throws Exception {System.out.println("==7 [DisposableBean 接口]调用了 DisposableBean.destroy()");}}@ComponentScan(basePackages = "spring")public class SpringTest {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringTest.class);System.out.println("spring 容器初始化成功");Person person1 = context.getBean(Person.class);//Person person2 = context.getBean(Person.class);//boolean r = person1 == person2;//System.out.println("person1 == person2 结果为:" + r); //结果为:false, 在BeanFactoryPostProcessor 中修改了bean scopecontext.registerShutdownHook();System.out.println("main结束");}}==[BeanFactoryPostProcessor 接口]调用了 CustomBeanFactoryPostProcessor 构造器==[BeanFactoryPostProcessor 接口]调用了 CustomBeanFactoryPostProcessor.postProcessBeanFactory() 修改bean定义==[BeanPostProcessor 接口]调用了 CustomBeanPostProcessor 构造器==4 [BeanPostProcessor 接口]调用了 springTest.postProcessBeforeInitialization()==6 [BeanPostProcessor 接口]调用了 springTest.postProcessAfterInitialization()//通过以下输出可以观察到person对象,生命周期接口方法调用顺序==1 [Person]调用了构造器,进行对象实例化==2 [BeanNameAware 接口]调用了 BeanNameAware.setBeanName()==3 [BeanFactoryAware 接口]调用了 BeanFactoryAware.setBeanFactory()==4 [BeanPostProcessor 接口]调用了 person.postProcessBeforeInitialization()==5.1 [@PostConstruct]调用了 Person.demo()==5.2 [InitializingBean 接口]调用了 InitializingBean.afterPropertiesSet()==6 [BeanPostProcessor 接口]调用了 person.postProcessAfterInitialization()spring 容器初始化成功person1 == person2 结果为:truemain结束==7 [DisposableBean 接口]调用了 DisposableBean.destroy()


推荐阅读