吾本轻狂|Spring4基础知识九:Spring之IoC-Bean装配之Bean后处理器( 二 )

总结:为了定义Bean后处理器的处理顺序 , 可以实现Ordered或者PriorityOrdered接口 , 并在getOrder()方法中返回顺序 。 这个方法的返回值越低 , 就代表越高的优先级 , PriorityOrdered接口返回的顺序总是优先于Ordered接口的返回值 。 为了统一一般会实现同一个接口 。
演示
上面说到一个Bean初始化完毕的标志是:一个方法即将被执行 。 那我们可以利用上一章节讲的来定制Bean的生命始末:
定制Bean初始化后的行为(在生成bean时对某些资源进行初始化) , 以及Bean销毁前的行为(在销毁bean时对某些资源进行释放) 。 这两个行为的定义需要通过``标签的属性init-method以及destroy-method完成 。 - init-method:指定初始化方法的名称 。 - destroy-method:指定销毁方法的名称 。

  • Bean后处理器定义(MyBeanPostProcessor1、MyBeanPostProcessor2)
【吾本轻狂|Spring4基础知识九:Spring之IoC-Bean装配之Bean后处理器】//第一个Bean后处理器public class MyBeanPostProcessor1 implements BeanPostProcessor,PriorityOrdered {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("我是第一个Bean后处理器----初始化前Before----getOrder["+getOrder()+"]");return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("我是第一个Bean后处理器----初始化后After----getOrder["+getOrder()+"]");return bean;}@Overridepublic int getOrder() {return 1;}}//第二个Bean后处理器public class MyBeanPostProcessor2 implements BeanPostProcessor,PriorityOrdered {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("我是第二个Bean后处理器----初始化前Before----getOrder["+getOrder()+"]");return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("我是第二个Bean后处理器----初始化后After----getOrder["+getOrder()+"]");return bean;}@Overridepublic int getOrder() {return 2;}}
  • 实体Bean
public class Country{private int id;private String name;public Country() {System.out.println("无参构造器实例化...");}public void init(){System.out.println("我是初始化方法 。。。。 ");}public void destroy(){System.out.println("我是销毁方法 。。。。");}}
  • xml配置
  • 测试
@Testpublic void test1(){ClassPathXmlApplicationContext application = new ClassPathXmlApplicationContext("applicationContext.xml");Country country = (Country)application.getBean("country");System.out.println(country);application.close();//销毁}
  • 测试结果
在说测试结果前有个问题需要探讨一下!大家认为以上的测试会是什么输出结果呢???和下面的一不一样??
无参构造器实例化...我是第一个Bean后处理器----初始化前Before----getOrder[1]我是第二个Bean后处理器----初始化前Before----getOrder[2]我是初始化方法 。。。。 我是第一个Bean后处理器----初始化后After----getOrder[1]我是第二个Bean后处理器----初始化后After----getOrder[2]com.spring.bean.Country@3d45bd我是销毁方法 。。。。


推荐阅读