Spring框架, bean的生命周期中,初始化和销毁.

我们可以配置bean的初始化和销毁前的方法, 有三种方法:

1,在配置文件中的<beans>标签中配置

default-init-method="defautInit" default-destroy-method="defaultDestroy"

然后在bean中去写定义"defautlinit"和"defaultDestroy"方法:

public voiddefautInit() {
System.out.println("bean的销毁方法..");
}

public void defaultDestroy() {
System.out.println("初始化方法..");
}


2, 还是在配置文件中, 但是是在具体的bean标签中配置:

<bean id="helloWorld"

            class="main.java.com.sommer.learn.HelloWorldImpl" 

            init-method = "start"

            scope="prototype" 

            destroy-method="cleanup"  

            scope="prototype">

然后在这个HelloWorldImplbean里定义相应的两个方法:

public void start(){

System.out.println("ioc容器初始化前会初始化bean");

System.out.println("bean初始化前会调用的方法");

}

public void cleanup(){

System.out.println("ioc容器销毁前会先销毁bean");

System.out.println("bean销毁前会调用的方法");

}


3, 在bean中实现InitializingBean,DisposableBean接口,实现接口中的方法:

@Override
public void destroy() throws Exception {
System.out.println("bean的销毁方法..");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("初始化方法..");
}

出现了一个问题, 我测试的时候发现初始化ioc时, 初始化bean方法是陪成功被触发了,比如start(), afterPropertiesSet(), defautInit(). 但是执行ioc的销毁方法destroy()后没去执行关于销毁bean的方法, cleanup()defaultDestroy(),afterPropertiesSet()....


原因是在bean里配置了的bean作用域: scope="prototype" ...   prototype属性. 其实上面的测试,bean的销毁是依赖ioc的销毁而自动销毁的. 但是prototype属性的bean, ioc是不管的, 需要我们自己来解决.所以在用destroy()方法销毁ioc容器的时候,并未去销毁里面的prototype属性的bean, 所以也没有调用之前定义的bean销毁前方法.....


prototype作用域部署的bean,每一次请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)都会产生一个新的bean实例,相当与一个new的操作,对于prototype作用域的bean,有一点非常重要,那就是Spring不能对一个prototype bean的整个生命周期负责,容器在初始化、配置、装饰或者是装配完一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。不管何种作用域,容器都会调用所有对象的初始化生命周期回调方法,而对prototype而言,任何配置好的析构生命周期回调方法都将不会被调用。清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源,都是客户端代码的职责。

(让Spring容器释放被singleton作用域bean占用资源的一种可行方式是,通过使用bean的后置处理器,该处理器持有要被清除的bean的引用。)













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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值