1 在容器中注册的bean到底什么时候初始化的问题?
验证方式:在默认方法里面输出一句话即可知道,是否容器建立后就实例化在里面注册的bean了。
------------
public class PersonServiceBean implements PersonService {
public PersonServiceBean() {
System.out.println("我被实例化了");
}
}
-------------
<bean id=”personService” class=”cn.beanservice.PersonService” />
-------------
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
//输出了“我被实例化了”。说明容器建立时就实例化注册在里面的bean
//////////////////如果注册时,改为scope=”prototype”,那么容器实例化的时候不会实例化bean,只有在通过容器getBean的时候实例化!!但是如果是scope=”singleton”或者省略会与容器同时。
加上lazy-init=”false”:不在容器实例化的时候实例化该bean
如何让bean在实例化的时候执行一个方法?
指定bean的属性init-method=”init”
public class PersonServiceBean implements PersonService {
public void init() {
System.out.println("做好数据库链接");
}
Public void save(){
System.out.println(“执行save方法”);
}
}
<bean id=”personService” class=”cn.beanservice.PersonService”
Inin-method=”init”/>
这样不管什么时候初始化bean,都会执行init-method参数指定的方法
同时,我们在销毁一个实例的时候,也需要做一些工作,比如,关闭数据库连接
指定bean的属性 destroy-method
public class PersonServiceBean implements PersonService {
public void init() {
System.out.println("做好数据库链接");
}
Public void save(){
System.out.println(“执行save方法”);
}
Public void destroy(){
System.out.println(“我被销毁了”);
}
}
<bean id=”personService” class=”cn.beanservice.PersonService”
Inin-method=”init” destroy-method=”destroy”/>
现在一个问题:容器中的bean什么时候被销毁?应该是容器被关闭的时候。
容器关闭我们需要一个抽象类:
AbstractApplicationContext ctx = new
ClassPathXmlApplicationContext(“beans.xml”);
………
ctx.close();
-----------使用实现接口的方式初始化和销毁bean-------------
Lifecycle接口
Spring提供了几个标志接口(marker interface),这些接口用来改变容器中bean的行为;它们包括InitializingBean和DisposableBean。实现这两个接口的bean在初始化和析构时容器会调用前者的afterPropertiesSet()方法,以及后者的destroy()方法。
Spring在内部使用BeanPostProcessor实现来处理它能找到的任何标志接口并调用相应的方法。如果你需要自定义特性或者生命周期行为,你可以实现自己的 BeanPostProcessor。关于这方面更多的内容可以看第 3.7 节 “容器扩展点”。
下面讲述了几个生命周期标志接口。在附录中会提供相关的示意图来展示Spring如何管理bean,以及生命周期特性如何改变bean的内在特性。
初始化回调
实现org.springframework.beans.factory.InitializingBean接口允许容器在设置好bean的所有必要属性后,执行初始化事宜。InitializingBean接口仅指定了一个方法:
void afterPropertiesSet() throws Exception;
通常,要避免使用InitializingBean接口(而且不鼓励使用该接口,因为这样会将代码和Spring耦合起来)可以在Bean定义中指定一个普通的初始化方法,即在XML配置文件中通过指定init-method属性来完成。如下面的定义所示:
<bean id="exampleInitBean" class="examples.ExampleBean" init-method="init"/>
public class ExampleBean {
public void init() {
// do some initialization work
}
}
(效果)与下面完全一样
<bean id="exampleInitBean" class="examples.AnotherExampleBean"/>
public class AnotherExampleBean implements InitializingBean {
public void afterPropertiesSet() {
// do some initialization work
}
}
但是没有将代码与Spring耦合在一起。
3.5.1.2. 析构回调
实现org.springframework.beans.factory.DisposableBean接口的bean允许在容器销毁该bean的时候获得一次回调。DisposableBean接口也只规定了一个方法:
void destroy() throws Exception;
通常,要避免使用DisposableBean标志接口(而且不鼓励使用该接口,因为这样会将代码与Spring耦合在一起)可以在bean定义中指定一个普通的析构方法,即在XML配置文件中通过指定destroy-method属性来完成。如下面的定义所示:
<bean id="exampleInitBean" class="examples.ExampleBean" destroy-method="cleanup"/>
public class ExampleBean {
public void cleanup() {
// do some destruction work (like releasing pooled connections)
}
}
(效果)与下面完全一样
<bean id="exampleInitBean" class="examples.AnotherExampleBean"/>
public class AnotherExampleBean implements DisposableBean {
public void destroy() {
// do some destruction work (like releasing pooled connections)
}
}
但是没有将代码与Spring耦合在一起。
分享到:
相关推荐
Spring源码学习六:bean初始化1
3、通过spring的xml bean配置或bean注解指定初始化方法,如下面实例的initMethod方法通过@bean注解指定。 销毁的时候实现的方法 1、通过java提供的@PreDestroy注释; 2、通过实现spring提供的DisposableBean接口,并...
主要介绍了Spring Bean的初始化和销毁,结合实例形式详细分析了Spring Bean的初始化和销毁相关配置、使用方法及操作注意事项,需要的朋友可以参考下
Spring Bean创建初始化流程
本篇文章主要介绍了Spring 中如何控制2个bean中的初始化顺序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Spring Boot技术知识点:Bean装配1
NULL 博文链接:https://bijian1013.iteye.com/blog/2374256
SPRING:bean配置properties
Spring IOC容器可以管理Bean的生命周期,允许在Bean生命周期的特定点执行定制的任务。 Spring IOC容器对Bean的生命周期...在 Bean 的声明里设置 init-method 和 destroy-method 属性, 为 Bean 指定初始化和销毁方法。
(6)如果BeanPostProcessor和Bean关联,则Spring将调用该接口的预初始化方法postProcessBeforeInitialzation()对Bean进行加工操作,这个非常重要,Spring的AOP就是用它实现的。 (7)如果Bean实现了...
主要介绍了Spring Bean初始化及销毁多种实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
初始化后可访问Spring管理的Bean
实例化Bean有三种方式,分别为构造器实例化、静态工厂方式实例化和实例工厂方式实例化(其中最常用的是构造器实例化)。 2.2.1 构造器实例化 创建Web项目,导入相关Jar包; 创建名为Bean1的Java类; 创建Spring配置...
Spring源码学习五:BeanDefinition装载1
要想使用这个工厂生产和管理Bean,就需要在配置文件中告诉它需要哪些Bean,以及需要使用何种方式将这些Bean装配到一起。 小提示: Bean的本质就是Java中的类,而Spring中的Bean其实就是对实体类的引用,来生产Java类...
下面小编就为大家带来一篇浅谈spring容器中bean的初始化。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
因此,我们有2种配置,它们使用名称beanName实例化bean,在主应用程序中,我们仅打印该bean的值(非常重要的是,它们都具有相同的名称)。 那么您认为将要打印什么? 示例1 @SpringBootApplication public class ...
spring的初始化,可以让初学者了解soring的开发过程,让开发轻松进入开发大门。
创建Spring配置文件,配置Bean; 创建测试类,测试程序。 @Repository("userDao") public class UserDaoImpl implements UserDao{ public void save(){ System.out.println("userdao...save..."); } } public class...