`

知识点三:Bean的初始化方法和销毁方法

阅读更多
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耦合在一起。




分享到:
评论

相关推荐

    基于java的企业级应用开发:Bean的生命周期.ppt

    - BeanPostProcessor接口的`postProcessBeforeInitialization()`方法在Bean初始化之前调用,可以用于预处理,例如AOP代理的实现。 - 同样,`postProcessAfterInitialization()`方法在初始化完成后调用,为Bean的...

    Spring Bean初始化及销毁多种实现方式

    Spring Bean 初始化及销毁是 Spring 框架中非常重要的知识点。Spring 提供了多种不同的方式来初始化和销毁 Bean,这些方式包括 init-method/destroy-method、InitializingBean/DisposableBean、@PostConstruct/@...

    第四章 Spring Bean基础1

    - 这些题目可能涵盖上述知识点,例如 BeanDefinition 的重要性,如何命名和管理 Bean,以及生命周期方法的使用等。 掌握 Spring Bean 的基础是理解 Spring 框架的关键,这涉及到 Bean 的定义、管理、装配和生命...

    Spring依赖注入:深入理解与实践应用

    例如,实现InitializingBean接口和DisposableBean接口可以让开发者分别定义Bean初始化后的操作和销毁前的操作。 知识点七:在Spring中,Bean的依赖关系和生命周期的管理是通过Spring容器来实现的。Spring容器负责...

    基于java的企业级应用开发:Bean的配置.ppt

    除了 `id` 和 `class` ,`&lt;bean&gt;` 还可以包含其他许多属性,如 `init-method` 用于指定初始化方法,`destroy-method` 指定销毁方法,以及 `scope` 来定义Bean的作用域(如单例、原型等)。此外,还可以通过 `...

    JSF 资源 managed bean 课件

    - **初始化**:可以通过定义初始化方法来执行额外的初始化操作。 - **销毁**:当容器不再需要Bean时,可以调用销毁方法来进行资源清理等工作。 #### 五、Bean的作用域 - **Request Scope**:每个HTTP请求都会创建一...

    spring bean XML配置入门

    我们还可以在XML配置中定义Bean的初始化方法(`init-method`)和销毁方法(`destroy-method`),Spring容器会在适当的时间调用这些方法。 9. **Spring容器的启动与Bean的生命周期**: 一旦XML配置加载到Spring...

    spring的bean加载顺序样例项目

    - Spring提供了一些回调接口,如`InitializingBean`和`DisposableBean`,开发者可以实现这些接口的方法来进行自定义的初始化和销毁操作。 8. **配置元数据的合并** - 如果有多个配置源,如多个`beans.xml`文件或...

    Spring bean 管理

    - 通过&lt;bean&gt;标签的init-method和destroy-method属性指定初始化和销毁方法。 - 容器在创建Bean实例时调用初始化方法,在销毁Bean实例前调用销毁方法。 - Bean的生命周期过程包括实例化、属性赋值、BeanNameAware...

    粗略实现spring创建bean

    - 初始化:Spring容器在创建Bean实例时,会执行初始化过程,包括实例化、属性设置(通过setter方法或构造函数注入)、初始化回调(如`InitializingBean`接口的`afterPropertiesSet()`方法或`@PostConstruct`注解的...

    spring 3.x教程

    - **&lt;bean/&gt; 元素的 init-method 属性**:指定一个初始化方法。 - **@PreDestroy 注解**:标记在销毁前立即执行的方法。 - **DisposableBean 回调接口**:提供了一个destroy() 方法,在容器销毁Bean 时调用。 - **...

    谈谈我对Spring Bean 生命周期的理解

    其中,@PostConstruct 和 @PreDestroy 注解是 Spring 2.5 中引入的注解,用于指定 Bean 的初始化和销毁方法。InitializingBean 和 DisposableBean 接口则需要手动实现初始化和销毁方法。 四、 ApplicationContext ...

    猿星人的修仙之路II

    ### 知识点三:BeanFactory 和 FactoryBean 的区别 #### 1.3.1 BeanFactory 和 FactoryBean 的区别 ##### BeanFactory - 以 Factory 结尾,表示它是一个工厂类,用于管理 Bean。 - 提供基本的 Bean 创建与依赖...

    bean学习笔记

    初始化阶段可以通过`init-method`属性指定初始化方法,活跃期是Bean被创建后到被销毁前的时间,销毁阶段可以通过`destroy-method`属性指定销毁方法。此外,还可以使用Lifecycle接口或InitializingBean和...

    spring面试总结

    - `init-method`和`destroy-method`:在Bean初始化时调用`init-method`指定的方法,在容器关闭时调用`destroy-method`指定的方法。 - Spring容器的生命周期包括对象实例化、属性设置、接口回调(如`BeanNameAware`...

    第四课:IOC容器设计理念与源码解读 (2)1

    - **生命周期**:Bean的创建、初始化、使用和销毁过程可以被自定义,通过接口或者配置元数据进行控制,包括初始化方法、销毁方法等。 - **装载机制**:Spring提供了多种Bean的装载方式,如通过XML配置、注解驱动等...

    MZ_SCBCD_5_Study_Guide

    - **初始化**:Bean创建后立即执行`@PostConstruct`方法; - **销毁**:容器销毁Bean前调用`@PreDestroy`方法。 **知识点8:拦截器** - **实现拦截器类**:继承自`javax.interceptor.Interceptor`; - **拦截器...

    Spring学习笔记(9)----让Spring自动扫描和管理Bean

    例如,你可以使用`@PostConstruct`和`@PreDestroy`注解来标识初始化和销毁方法。 ### **其他注解** 除了基本的`@Component`家族,Spring还提供了一些高级注解,如`@Scope`用于定义Bean的作用域,`@Lazy`用于延迟...

    spring bean加载

    - Spring容器提供了各种事件,如`ContextRefreshedEvent`(容器启动或刷新时触发)、`BeanInitializedEvent`(Bean初始化后触发)。通过实现`ApplicationListener`接口,可以监听并响应这些事件。 8. **Spring ...

    SpringBoot之Bean的使用及处理

    5. **Bean的初始化与销毁**:通过@PostConstruct和@PreDestroy注解,可以指定Bean在初始化后和销毁前执行的代码。Spring容器会在适当的时候调用这些方法。 6. **条件化Bean**:通过@Conditional注解,我们可以控制...

Global site tag (gtag.js) - Google Analytics