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.....................

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。