Spring-8 bean的生命周期

在学习Servlet的时候,也提过生命周期。人从出生,到死亡经历一个过程,bean也一样,每个bean经历5个阶段:
1.通过构造器或工厂方法创建 Bean 实例
2.为 Bean 的属性设置值和对其他 Bean 的引用
3.调用 Bean 的初始化方法
4.Bean 可以使用了
5.当容器关闭时, 调用 Bean 的销毁方法
下面通过一个例子来说明:
(1)src/com/csu/cycle/Country.class

package com.csu.cycle;

public class Country {
    private String name;
    private int size;

    public Country() {
        // TODO Auto-generated constructor stub
        //观察什么时候调用构造器
        System.out.println("constructor....");
    }

    public Country(String name, int size) {
        super();
        this.name = name;
        this.size = size;
    }

    public void init() {
    //观察什么时候初始化
        System.out.println("init.....");
    }

    public void destory() {
    //观察什么时候销毁
        System.out.println("destory....");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    @Override
    public String toString() {
        return "Country [name=" + name + ", size=" + size + "]";
    }


}

(2)src/beans-cycle.xml:

<!--init-method 和 destory-method指定方法名,该方法名可以自己取-->
<bean id="country" class="com.csu.cycle.Country"
    p:name="China" p:size="960" init-method="init"
    destroy-method="destory"
    ></bean>

(3)src/com/csu/cycle/Main.class

public static void main(String[] args) {
        ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("beans-cycle.xml");
        Country country=(Country) context.getBean("country");
        System.out.println(country);
        context.close();
    }

接下来看看运行结果:
这里写图片描述

从运行结果可以看出来,首先用构造器获得了一个bean赋好属性值,然后调用了Country的init方法,接下来打印出country,最后调用destroy方法销毁。

这里写图片描述

除此之外,在调用Init方法前后,还可以进行一些细化的工作,用到spring的一个接口:BeanPostProcessor, 该接口定义了两个方法:
public Object postProcessAfterInitialization(Object bean, String beanName),
public Object postProcessBeforeInitialization(Object bean, String arg1);

(1)src/com.csu.cycle/ProPostProcessor.class:

public class PropostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        // TODO Auto-generated method stub  
        System.out.println("after init"+bean+beanName);
        return bean;
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String arg1) throws BeansException {
        // TODO Auto-generated method stub
        System.out.println("before init"+bean+arg1);
        return bean;
    }

}

(2) beans-cycle.xml:
IOC会自动识别实现了BeanPostProcessor接口的类,所以这里没有必要再定义id了,并且PropostProcessor 对所有bean都起作用(如果需要对只对某个特定的bean起作用,则在方法中做判断)。

<bean class="com.csu.cycle.PropostProcessor"></bean>

运行结果是:
这里写图片描述

最后,在这两个方法:
public Object postProcessAfterInitialization(Object bean, String beanName),
public Object postProcessBeforeInitialization(Object bean, String arg1);
中,可以把bean给偷梁换柱了再返回去,例如:

public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        // TODO Auto-generated method stub
        //可偷梁换柱
        bean = new Country("USA",77);       
        System.out.println("after init"+bean+beanName);
        return bean;
    }

这样运行结果是:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值