首页 > 代码库 > Spring的Bean的生命周期以及Bean的后置处理器

Spring的Bean的生命周期以及Bean的后置处理器

Bean的生命周期:

Spring IOC 容器可以管理 Bean 的生命周期,
Spring 允许在 Bean 生命周期的特定点执行定制的任务.
Spring IOC 容器对 Bean 的生命周期进行管理的过程:
      1通过构造器或工厂方法创建 Bean 实例
      2为 Bean 的属性设置值和对其他 Bean 的引用
      3调用 Bean 的初始化方法(可以人为指定,利用Bean标签的inti-method属性指定初始化方法,不指定就默认忽略这步骤) Bean 可以使用了
      4当容器关闭时, 调用 Bean 的销毁方法(可以人为指定,利用Bean标签的destroy-method属性指定销毁方法,不指定就默认忽略这步骤 )

代码示例:
Bean实例代码:

package com.jeremy.spring.cycle;public class person {        private String Name;        public void setName(String name) {            Name = name;            System.out.println("Setter............");        }        public person() {            System.out.println("person constructor.......");        }                public void init(){            System.out.println("init......");        }        public void destory(){            System.out.println("desdtory......");        }        @Override        public String toString() {            return "person [Name=" + Name + "]";        }

配置了init-method和destroy-method后

测试代码:

    @Test    public void testNoProcessorCycle(){        ConfigurableApplicationContext caContext=new ClassPathXmlApplicationContext("Bean-cycle.xml");        person person=(com.jeremy.spring.cycle.person) caContext.getBean("person");        caContext.close();    }

测试结果:

person constructor.......
Setter............
init......
2014-10-14 19:49:36 org.springframework.context.support.AbstractApplicationContext doClose
信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@8965fb: startup date [Tue Oct 14 19:49:35 CST 2014]; root of context hierarchy
desdtory......

证明Bean的声明流程如上所说

1为什么需要Bean的后置处理器(就是用来在容器调用Bean的init()的方法前后进行处理)---一旦IOC配置了Bean的后置处理器是对Bean所在的IOC容器里面所有Bean都是有效的
如果不配置后置处理器,每次IOC容器就直接示例化Bean,但是如果再实际的开发中,我们需要在Bean初始前配置和其他的初始化后添加一些自己的逻辑处理??那怎么办,那这时候就需要用到Bean的后置处理器了

2配置Bean后置处理器的步骤:

  1需要新建一个类实现BeanPostProcessor接口,并实现 postProcessAfterInitialization(Object arg0, String arg1), postProcessBeforeInitialization(Object arg0, String arg1)两个方法

   arg0:就是传入的Bean对象,
   arg1:就是Bean的ID值
   返回值:就是返回一个Bean对象,我们也可以认为的修改返回的Bean对象,不一定一定要返回容器初始化的那个Bean对象
  代码下:
  

package com.jeremy.spring.cycle;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanPostProcessor;public class MyBeanPostProcessor implements BeanPostProcessor {    public MyBeanPostProcessor() {        // TODO Auto-generated constructor stub    }    @Override    public Object postProcessAfterInitialization(Object arg0, String arg1)            throws BeansException {        System.out.println("before init..........."+arg0.getClass());        return arg0;    }    @Override    public Object postProcessBeforeInitialization(Object arg0, String arg1)            throws BeansException {        // TODO Auto-generated method stub        System.out.println("after init..........."+arg0.getClass());        return arg0;    }}

2在XML配置文件配置后置处理器,

<!-- 配置 bean 后置处理器: 不需要配置 id 属性, IOC 容器会识别到他是一个 bean 后置处理器, 并调用其方法 -->
<bean class="com.jeremy.spring.cycle.MyBeanPostProcessor"></bean>

3测试代码

@Test    public void testNoProcessorCycle(){        ConfigurableApplicationContext caContext=new ClassPathXmlApplicationContext("Bean-cycle.xml");        person person=(com.jeremy.spring.cycle.person) caContext.getBean("person");        caContext.close();    }

 

运行结果:
这是具有后置处理器Bean的生命流程流程如下:

person constructor.......
Setter............

before init...........class com.jeremy.spring.cycle.person
init...................
after init...........class com.jeremy.spring.cycle.person
destory.....................

Spring的Bean的生命周期以及Bean的后置处理器