Spring 容器可以管理 singleton 作用域 Bean 的生命周期,容器能够跟踪 Bean 实例的创建、销毁。管理 Bean 生命周期行为主要有两个时机:
  注入 Bean 的依赖关系之后
  即将销毁 Bean 之间

依赖关系注入之后的行为

有三种方式可以在 Bean 的所有属性设置成功后执行特定的行为:
  实现 org.springframework.beans.factory.InitializingBean 接口
  使用 init-method 属性
  使用 @PostConstruct 注解

实现 InitializingBean 接口的示例

Bean 的定义:

public class ExampleBean implements InitializingBean {

    private String field1;
private String field2; public void setField1(String field1) {
this.field1 = field1;
System.out.println("field1 was set.");
} public void setField2(String field2) {
this.field1 = field2;
System.out.println("field2 was set.");
} public ExampleBean() {
System.out.println("In ExampleBean Constructor.");
} public void afterPropertiesSet() throws Exception {
System.out.println("All properties were set."
);
}
}

Spring 配置:

<bean id="eb" class="com.huey.dream.bean.ExampleBean">
<property name="field1" value=""/>
<property name="field2" value=""/>
</bean>

测试方法:

@Test
public void testLifecycle() throws Exception {
ApplicationContext appCtx =
new ClassPathXmlApplicationContext("applicationContext.xml");
}

结果输出:

In ExampleBean Constructor.
field1 was set.
field2 was set.
All properties were set.

使用 init-method 属性的示例

Bean 的定义:

public class ExampleBean  {

    private String field1;
private String field2; public void setField1(String field1) {
this.field1 = field1;
System.out.println("field1 was set.");
} public void setField2(String field2) {
this.field1 = field2;
System.out.println("field2 was set.");
} public ExampleBean() {
System.out.println("In ExampleBean Constructor.");
} public void init() throws Exception {
System.out.println("In init method."
);
}
}

Spring 配置:

<bean id="eb" class="com.huey.dream.bean.ExampleBean" init-method="init">
<property name="field1" value=""/>
<property name="field2" value=""/>
</bean>

使用 @PostConstruct 注解

Bean 的定义:

public class ExampleBean  {

    private String field1;
private String field2; public void setField1(String field1) {
this.field1 = field1;
System.out.println("field1 was set.");
} public void setField2(String field2) {
this.field1 = field2;
System.out.println("field2 was set.");
} public ExampleBean() {
System.out.println("In ExampleBean Constructor.");
} @PostConstruct
public void init() throws Exception {
System.out.println("In init method.");
} }

Spring 配置:

<bean id="eb" class="com.huey.dream.bean.ExampleBean">
<property name="field1" value=""/>
<property name="field2" value=""/>
</bean>

Bean 销毁之前的行为

与定制初始化行为类似,也有三种方式可以在 Bean 实例销毁前执行特定的行为:
  实现 org.springframework.beans.factory.DisposableBean 接口
  使用 destroy-method 属性
  使用 @PreDestroy 注解

Spring(3.2.3) - Beans(10): 生命周期的更多相关文章

  1. Spring中bean的作用域与生命周期

    在 Spring 中,那些组成应用程序的主体及由 Spring IOC 容器所管理的对象,被称之为 bean.简单地讲,bean 就是由 IOC 容器初始化.装配及管理的对象,除此之外,bean 就与 ...

  2. Spring中Bean的作用域和生命周期

    作用域的种类 Spring 容器在初始化一个 Bean 的实例时,同时会指定该实例的作用域.Spring3 为 Bean 定义了五种作用域,具体如下. 1)singleton 单例模式,使用 sing ...

  3. Spring中与bean有关的生命周期

    前言 记得以前的时候,每次提起Spring中的bean相关的生命周期时,内心都无比的恐惧,因为好像有很多,自己又理不清楚,然后看网上的帖子,好像都是那么一套,什么beanFactory啊,aware接 ...

  4. 详解Spring中Bean的作用域与生命周期

    摘要:在利用Spring进行IOC配置时,关于bean的配置和使用一直都是比较重要的一部分,同时如何合理的使用和创建bean对象,也是小伙伴们在学习和使用Spring时需要注意的部分,所以这一篇文章我 ...

  5. Spring中Bean的作用域、生命周期

                                   Bean的作用域.生命周期 Bean的作用域 Spring 3中为Bean定义了5中作用域,分别为singleton(单例).protot ...

  6. Spring - IoC(10): 生命周期

    Spring 容器可以管理 singleton 作用域 Bean 的生命周期,容器能够跟踪 Bean 实例的创建.销毁.管理 Bean 生命周期行为主要有两个时机: 注入 Bean 的依赖关系之后 即 ...

  7. 从启动日志看Spring IOC的初始化和Bean生命周期

    一.Tomcat中启动IoC容器的日志 启动Tomcat等容器时,控制台每次都打印出一些日志. 最近刚好在研究Spring源码,所以换个角度,从启动日志来简单的看看Spring的初始化过程! 以下是T ...

  8. Spring之Bean的作用域与生命周期

    在前面博客中提到容器启动获得BeanDefinition对象中有一个scope 属性.该属性控制着bean对象的作用域.本章节介绍Bean的作用域及生命周期,了解bean是怎么来的又怎么没的. 一.B ...

  9. Spring ( 三 ) Spring的Bean的装配与生命周期、专用测试

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.对象的生命周期 1.IOC之Bean的生命周期 创建带有生命周期方法的bean public cla ...

随机推荐

  1. jeecms附件标签用法

    [#if content.attachments?size gt 0] [#list content.attachments as attach] <a id="attach${att ...

  2. python dict{}和set([])

    200 ? "200px" : this.width)!important;} --> 介绍 dict(dictionary),在其他语言中也称为map,使用键-值(key- ...

  3. c++的操作符格式记录

    以下摘自维基百科,mark一下,以备不时之需. For the purposes of this table, a, b, and c represent valid values (literals ...

  4. static关键字修饰类

    今天继续研究公司的新项目,据说是京东的架构,研究看了一番,果然很牛逼,大致是Maven+spingmvc+spring+mybatis+ehcache+velocity来搭建的,数据库用的是mysql ...

  5. HTML5结构化标签

    一 结构化标签 在之前的HTML页面中,大家基本上都是用了Div+CSS的布局方式.而搜索引擎去抓取页面的内容的时候,它只能猜测你的某个Div内的内容是文章内容容器,或者是导航模块的容器,或者是作者介 ...

  6. java 分页

    ListAction.java package com.sy.action; import java.util.List; import com.opensymphony.xwork2.ActionS ...

  7. JS 的点点滴滴

    1. ||含义 : 返回第一个有效值 eg : <script type="text/javascript"> var a=""; var c = ...

  8. Oracle_11g_R2安装详解_for_Windows_7

    Oracle 11g R2安装全攻略 - For Windows 7 图文教程 1.下载Oracle 11g R2的Windows版本,官方下载地址如下: http://download.oracle ...

  9. PHP AJAXFORM提交图片上传并显示图片源代码

    PHP dofile.php 文件上传源代码 <? php $file_upload = "upload/"; $file_allow_ext='gif|jpg|jpeg|p ...

  10. C++ 预编译头文件

    1.解决什么问题? C++ 编译器是单独,分别编译的,每个cpp文件,进行预编译(也就是对#include,define 等进行文本替换),生成编译单元.编译单元是一个自包含文件,C++编译器对编译单 ...