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 - IoC(10): 生命周期的更多相关文章

  1. Spring Bean的生命周期、Spring MVC的工作流程、IOC,AOP

    1.Spring Bean的生命周期? (1)构造方法实例化bean. (2)构造方法设置对象属性. (3)是否实现aware接口,三种接口(BeanNameAware,BeanFactoryAwar ...

  2. 第37讲 谈谈Spring Bean的生命周期和作用域

    在企业应用软件开发中,Java 是毫无争议的主流语言,开放的 Java EE 规范和强大的开源框架功不可没,其中 Spring 毫无疑问已经成为企业软件开发的事实标准之一.今天这一讲,我将补充 Spr ...

  3. Spring Bean的生命周期,《Spring 实战》书中的官方说法

    连着两天的面试 ,都问到了 Spring 的Bean的生命周期,其中还包括 昨晚一波阿里的电话面试.这里找到了Spring 实战中的官方说法.希望各位要面试的小伙伴记住,以后有可能,或者是有时间 去看 ...

  4. 在web.xml中配置监听器来控制ioc容器生命周期

    5.整合关键-在web.xml中配置监听器来控制ioc容器生命周期 原因: 1.配置的组件太多,需保障单实例 2.项目停止后,ioc容器也需要关掉,降低对内存资源的占用. 项目启动创建容器,项目停止销 ...

  5. Spring学习手札(四)谈谈Spring Bean的生命周期及作用域

    在Spring中,那些组成应用程序的主体以及由Spring IoC容器所管理的对象,被称之为Bean.Bean与应用程序中其他对象(比如自己创建类)的区别就是,Bean是由IoC容器创建于销毁的.在S ...

  6. Spring Bean的生命周期详解(转)

    Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring ...

  7. Spring5源码解析-论Spring DispatcherServlet的生命周期

    Spring Web框架架构的主要部分是DispatcherServlet.也就是本文中重点介绍的对象. 在本文的第一部分中,我们将看到基于Spring的DispatcherServlet的主要概念: ...

  8. 谈谈Spring bean的生命周期(一)

    简介 本片文章主要讲Spring IOC容器中 bean 的生命周期 Spring bean 生命周期 Spring 中bean的声明周期 可以分为如下4个阶段: 实例化阶段--Instantiati ...

  9. Spring应用上下文生命周期

    Spring应用上下文生命周期整体分成四个阶段 ConfigurableApplicationContext#refresh,加载或者刷新持久化配置 ConfigurableApplicationCo ...

随机推荐

  1. 58HouseSearch项目迁移到asp.net core

    前言 58HouseSearch这个项目原本是基于ASP.NET MVC 4写的,开发环境是Windows+VS2015,发布平台是linux+mono+jexus,这样看来整个项目基本已经满足跨平台 ...

  2. crontab时间规则

    sudo crontab -e 5 * * * *每小时第5分钟执行*/5 * * * *每5分钟执行0 2 * * * 每天凌晨2点执行 cron是一个linux下的定时执行工具,可以在无需人工干预 ...

  3. 给socks-proxy-agent增加认证

    由于需要使用socks代理,查看了nodejs的各种socks库,最终的结论是socks库是其中最完善的,而socks-proxy-agent是以其为基础的封装,可以直接和http模块对接. 不过在尝 ...

  4. 「暑期训练」「Brute Force」 Far Relative’s Problem (CFR343D2B)

    题意 之后补 分析 我哭了,强行增加自己的思考复杂度...明明一道尬写的题- -(往区间贪心方向想了 其实完全没必要,注意到只有366天,直接穷举判断即可. 代码 #include <bits/ ...

  5. git安装后Gitbase闪退,gui无法使用问题解决

    一般是因为null.sys导致,根本原因应该还是你装的盗版系统有问题,解决办法如下 cmd 打开命题提示符后  输入  sc  start null  看 null.sys是否有问题,如果有问题,重新 ...

  6. react实现网站换肤功能

    一.目标   提供几种主题色给用户选择,然后根据用户的选择改变应用的主题色: 二.实现原理   1.准备不同主题色的样式文件:   2.将用户的选择记录在本地缓存中:   3.每次进入应用时,读取缓存 ...

  7. Android之内容提供者ContentProvider的总结

    本文包含以下知识点: ContentProvider Uri 的介绍 ContentResolver: 监听ContentProvider的数据改变 一:ContentProvider部分 Conte ...

  8. jira+mysql+破解+中文+compose

    1.制作docker-compose.yml 2.安装 $ docker stack deploy -c docker-compose.yml mshk_jira

  9. 在线算法&离线算法

    [在线算法] 定义:指用户每输入一个查询便马上处理一个查询.该算法一般用较长的时间做预处理,待信息充足以后便可以用较少的时间回答每个查询. 常见在线算法:ST算法 [离线算法] 定义:

  10. lintcode-64-合并排序数组 II

    64-合并排序数组 II 合并两个排序的整数数组A和B变成一个新的数组. 注意事项 你可以假设A具有足够的空间(A数组的大小大于或等于m+n)去添加B中的元素. 样例 给出 A = [1, 2, 3, ...