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的引用。)
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的引用。)
相关文章推荐
- 【Spring】Spring常用配置-Bean的初始化和销毁(生命周期)
- spring框架bean初始化给变量赋值(生命周期)-自己写着玩儿
- 【Spring学习21】Bean生命周期回调:初始化回调和销毁回调
- 在spring容器中定义初始化和销毁bean前所做的操作,有三种方式
- Spring容器中的Bean几种初始化方法和销毁方法的先后顺序
- Spring中bean的初始化和销毁之前的方法XML和注解的两种形式
- Spring bean通过实现InitializingBean ,DisposableBean接口实现初始化方法和销毁前操作
- spring(bean初始化、销毁、注入,作用域)
- 通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
- Spring中初始化bean和销毁bean的时候执行某个方法的详解
- Bean的初始化和销毁
- 通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
- 通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
- Bean的作用域_初始化_Bean的作用域_延迟初始化_指定Bean的初始化方法和销毁方法
- 通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
- Spring bean的初始化和销毁三种方式及优先级
- 通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
- 初始化和销毁bean之前的添加操作的方法
- Spring的IOC、Spring对象初始化bean时机、Spring容器生命周期
- Bean的初始化与销毁