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耦合在一起。
分享到:
相关推荐
- BeanPostProcessor接口的`postProcessBeforeInitialization()`方法在Bean初始化之前调用,可以用于预处理,例如AOP代理的实现。 - 同样,`postProcessAfterInitialization()`方法在初始化完成后调用,为Bean的...
Spring Bean 初始化及销毁是 Spring 框架中非常重要的知识点。Spring 提供了多种不同的方式来初始化和销毁 Bean,这些方式包括 init-method/destroy-method、InitializingBean/DisposableBean、@PostConstruct/@...
- 这些题目可能涵盖上述知识点,例如 BeanDefinition 的重要性,如何命名和管理 Bean,以及生命周期方法的使用等。 掌握 Spring Bean 的基础是理解 Spring 框架的关键,这涉及到 Bean 的定义、管理、装配和生命...
例如,实现InitializingBean接口和DisposableBean接口可以让开发者分别定义Bean初始化后的操作和销毁前的操作。 知识点七:在Spring中,Bean的依赖关系和生命周期的管理是通过Spring容器来实现的。Spring容器负责...
除了 `id` 和 `class` ,`<bean>` 还可以包含其他许多属性,如 `init-method` 用于指定初始化方法,`destroy-method` 指定销毁方法,以及 `scope` 来定义Bean的作用域(如单例、原型等)。此外,还可以通过 `...
- **初始化**:可以通过定义初始化方法来执行额外的初始化操作。 - **销毁**:当容器不再需要Bean时,可以调用销毁方法来进行资源清理等工作。 #### 五、Bean的作用域 - **Request Scope**:每个HTTP请求都会创建一...
我们还可以在XML配置中定义Bean的初始化方法(`init-method`)和销毁方法(`destroy-method`),Spring容器会在适当的时间调用这些方法。 9. **Spring容器的启动与Bean的生命周期**: 一旦XML配置加载到Spring...
- Spring提供了一些回调接口,如`InitializingBean`和`DisposableBean`,开发者可以实现这些接口的方法来进行自定义的初始化和销毁操作。 8. **配置元数据的合并** - 如果有多个配置源,如多个`beans.xml`文件或...
- 通过<bean>标签的init-method和destroy-method属性指定初始化和销毁方法。 - 容器在创建Bean实例时调用初始化方法,在销毁Bean实例前调用销毁方法。 - Bean的生命周期过程包括实例化、属性赋值、BeanNameAware...
- 初始化:Spring容器在创建Bean实例时,会执行初始化过程,包括实例化、属性设置(通过setter方法或构造函数注入)、初始化回调(如`InitializingBean`接口的`afterPropertiesSet()`方法或`@PostConstruct`注解的...
- **<bean/> 元素的 init-method 属性**:指定一个初始化方法。 - **@PreDestroy 注解**:标记在销毁前立即执行的方法。 - **DisposableBean 回调接口**:提供了一个destroy() 方法,在容器销毁Bean 时调用。 - **...
其中,@PostConstruct 和 @PreDestroy 注解是 Spring 2.5 中引入的注解,用于指定 Bean 的初始化和销毁方法。InitializingBean 和 DisposableBean 接口则需要手动实现初始化和销毁方法。 四、 ApplicationContext ...
### 知识点三:BeanFactory 和 FactoryBean 的区别 #### 1.3.1 BeanFactory 和 FactoryBean 的区别 ##### BeanFactory - 以 Factory 结尾,表示它是一个工厂类,用于管理 Bean。 - 提供基本的 Bean 创建与依赖...
初始化阶段可以通过`init-method`属性指定初始化方法,活跃期是Bean被创建后到被销毁前的时间,销毁阶段可以通过`destroy-method`属性指定销毁方法。此外,还可以使用Lifecycle接口或InitializingBean和...
- `init-method`和`destroy-method`:在Bean初始化时调用`init-method`指定的方法,在容器关闭时调用`destroy-method`指定的方法。 - Spring容器的生命周期包括对象实例化、属性设置、接口回调(如`BeanNameAware`...
- **生命周期**:Bean的创建、初始化、使用和销毁过程可以被自定义,通过接口或者配置元数据进行控制,包括初始化方法、销毁方法等。 - **装载机制**:Spring提供了多种Bean的装载方式,如通过XML配置、注解驱动等...
- **初始化**:Bean创建后立即执行`@PostConstruct`方法; - **销毁**:容器销毁Bean前调用`@PreDestroy`方法。 **知识点8:拦截器** - **实现拦截器类**:继承自`javax.interceptor.Interceptor`; - **拦截器...
例如,你可以使用`@PostConstruct`和`@PreDestroy`注解来标识初始化和销毁方法。 ### **其他注解** 除了基本的`@Component`家族,Spring还提供了一些高级注解,如`@Scope`用于定义Bean的作用域,`@Lazy`用于延迟...
- Spring容器提供了各种事件,如`ContextRefreshedEvent`(容器启动或刷新时触发)、`BeanInitializedEvent`(Bean初始化后触发)。通过实现`ApplicationListener`接口,可以监听并响应这些事件。 8. **Spring ...
5. **Bean的初始化与销毁**:通过@PostConstruct和@PreDestroy注解,可以指定Bean在初始化后和销毁前执行的代码。Spring容器会在适当的时候调用这些方法。 6. **条件化Bean**:通过@Conditional注解,我们可以控制...