Spring BeanFactoryPostProcessor Bean后处理器 执行时机

5 篇文章 0 订阅

这里写图片描述

上图是BeanPostProcessor 的两个接口的调用时机
下面我们来分析一下通过BeanFactory作为容器实例化bean及bean后处理器的执行时机:

  1. bean调用相应的构造函数,一般是空构造函数(该bean依赖的其他bean也调用自己的构造函数)
  2. Spring执行依赖关系注入(也就是根据spring自动调用setter方法)
  3. postProcessBeforeInitialization回调
  4. 执行初始化方法(配置接口实现afterPropertiesSet…或直接在xml中配置init-method方法)
  5. postProcessAfterInitialization回调
  6. 完成bean的实例化也就是现在我们 通过ctx.getbean(beanId)得到了我们需要的bean
//CLASSPATH路径下的bean.xml文件创建Resource对象
        ClassPathResource isr = new ClassPathResource("applicationContext.xml");
        //以Resource对象作为参数,创建BeanFactory的实例
        XmlBeanFactory factory = new XmlBeanFactory(isr);
        //获取Bean后处理器实例
        MyBeanPostProcessor prr = factory.getBean("beanPostProcessor"
            , MyBeanPostProcessor.class);
        //注册BeanPostProcessor实例
        factory.addBeanPostProcessor(prr);
        System.out.println("=============程序已经实例化BeanFactory...");
        Person p = factory.getBean("chinese" , Person.class);
        System.out.println("=============程序中已经完成了chinese bean的实例化...");
        p.useAxe();

输出:

=============程序已经实例化BeanFactory...
Spring实例化主调bean:Chinese实例...
Spring实例化依赖bean:SteelAxe实例...
Bean后处理器在初始化之前对steelAxe进行增强处理...@@@@@@@@@@@@@@@
Bean后处理器在初始化之后对steelAxe进行增强处理...@@@@@@@@@@@@@@@
Spring执行依赖关系注入...依赖注入的值
Bean后处理器在初始化之前对chinese进行增强处理...@@@@@@@@@@@@@@@
正在执行初始化方法  afterPropertiesSet...
正在执行初始化方法   init...
Bean后处理器在初始化之后对chinese进行增强处理...@@@@@@@@@@@@@@@
Spring执行依赖关系注入...Struts 2权威指南
=============程序中已经完成了chinese bean的实例化...
Struts 2权威指南钢斧砍柴真快

我们再来分析一下通过ApplicationContext(BeanFactory的子接口,用它就不用手动注册BeanPostProcessor)作为容器实例化bean及bean后处理器的执行时机:

  1. 实例化该bean依赖的bean(调用构造方法)
  2. 调用该bean的构造方法
  3. Spring执行依赖关系注入
  4. 执行初始化方法(配置接口实现afterPropertiesSet…或直接在xml中配置init-method方法)
  5. postProcessAfterInitialization回调
  6. 完成bean的实例化也就是现在我们 通过ctx.getbean(beanId)得到了我们需要的bean
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        System.out.println("=============程序已经实例化BeanFactory...");
        Person p = ctx.getBean("chinese" , Person.class);
        System.out.println("=============程序中已经完成了chinese bean的实例化...");
        p.useAxe();

输出:

Spring实例化依赖bean:SteelAxe实例...
Bean后处理器在初始化之前对steelAxe进行增强处理...@@@@@@@@@@@@@@@
Bean后处理器在初始化之后对steelAxe进行增强处理...@@@@@@@@@@@@@@@
Spring实例化主调bean:Chinese实例...
Spring执行依赖关系注入...依赖注入的值
Bean后处理器在初始化之前对chinese进行增强处理...@@@@@@@@@@@@@@@
正在执行初始化方法  afterPropertiesSet...
正在执行初始化方法   init...
Bean后处理器在初始化之后对chinese进行增强处理...@@@@@@@@@@@@@@@
Spring执行依赖关系注入...Struts 2权威指南
=============程序已经实例化BeanFactory...
=============程序中已经完成了chinese bean的实例化...
Struts 2权威指南钢斧砍柴真快
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值