您的位置:首页 > 编程语言 > Java开发

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

2017-07-10 14:50 405 查看
我们可以配置bean的初始化和销毁前的方法, 有三种方法:

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

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

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

public void
defautInit() {
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的引用。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  笔记
相关文章推荐