Bean的生命周期:

Bean的定义——Bean的初始化——Bean的使用——Bean的销毁

Bean的定义

Bean 是 Spring 装配的组件模型,一切实体类都可以配置成一个 Bean ,进而就可以在任何其他的 Bean 中使用,一个 Bean 也可以不是指定的实体类,这就是抽象 Bean 。

Bean的初始化

Spring中bean的初始化回调有两种方法
一种是在配置文件中声明init-method="init",然后在一个实体类中用init()方法来初始化

另一种是实现InitializingBean接口,覆盖afterPropertiesSet()方法。

第一种:

配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><bean id="init-one" class="org.spring.test.BeanInitDemo1" init-method="init"><property name="message" value="这里是配置文件中为message赋值"></property></bean>
</beans>

BeanInitDemo1类:

package org.spring.test;public class BeanInitDemo1 {private String message;public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public void init(){this.setMessage("这里是init()方法初始化设值");}
}

测试类:

package org.spring.test;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");BeanInitDemo1 bid = (BeanInitDemo1) context.getBean("init-one");System.out.println(bid.getMessage());}}

运行结果:
这里是init()方法初始化设值
原因:init()初始化方法的调用是在配置文件的Bean初始化之后执行的, 所以改变了配置文件中对message的赋值。

第二种:
配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><bean id="init-two" class="org.spring.test.BeanInitDemo2"><property name="message" value="这里是配置文件中为message赋值"></property></bean>
</beans>

编写BeanInitDemo2类,使其实现InitializingBean接口

package org.spring.test;import org.springframework.beans.factory.InitializingBean;public class BeanInitDemo2 implements InitializingBean{private String message;public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public void afterPropertiesSet() throws Exception {// TODO Auto-generated method stubthis.setMessage("这里覆盖了InitializingBean接口的afterPropertiesSet()方法设值");}}

测试:

package org.spring.test;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");BeanInitDemo2 bid = (BeanInitDemo2) context.getBean("init-two");System.out.println(bid.getMessage());}}

运行结果: 这里覆盖了InitializingBean接口的afterPropertiesSet()方法设值
 原因相同,afterPropertiesSet()方法在配置文件的Bean初始化后执行,所以改变了配置文件中对message的赋值

Bean的使用

Spring中有两种使用bean的方法:

1, BeanFactory:


BeanFactory factory= new XmlBeanFactory(new ClassPathResource("bean.xml"));
factory.getBean("student");
BeanFactory是延迟加载,如果Bean的某一个属性没有注入,BeanFacotry加载后,直至第一次使用getBean方法才会抛出异常,也就是说当使用BeanFactory实例化对象时,配置的bean不会马上被实例化。当你使用该bean时才会被实例化(getBean)。
2, ApplicationContext:


ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
如果使用ApplicationContext,则配置的bean如果是singleton不管你用还是不用,都被实例化。ApplicationContext在初始化自身时检验,这样有利于检查所依赖属性是否注入。ApplicationContext是BeanFactory的子类,除了具有BeanFactory的所有功能外还提供了更完整的框架功能,例如国际化,资源访问等。所以通常情况下我们选择使用ApplicationContext。

Bean的销毁

Bean的销毁和初始化一样,都是提供了两个方法
一是在配置文件中声明destroy-method="cleanup",然后在类中写一个cleanup()方法销毁
二是实现DisposableBean接口,覆盖destory()方法

第一种:
配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><bean id="destory-one" class="org.spring.test.BeanDestoryDemo1" destroy-method="cleanup"><property name="message" value="这里是配置文件中为message赋值"></property></bean>
</beans>

BeanDestoryDemo1类:

package org.spring.test;public class BeanDestoryDemo1 {private String message;public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public void cleanup(){System.out.println("销毁之前可以调用一些方法");}
}

测试:

package org.spring.test;import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class DestortTest {public static void main(String[] args) {AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");BeanDestoryDemo1 bdd = (BeanDestoryDemo1) context.getBean("destory-one");System.out.println(bdd.getMessage());context.registerShutdownHook();}
}

运行结果:

context.registerShutdownHook()是为spring注册关闭吊钩,程序退出之前关闭spring容器,如果没有context.registerShutdownHook();将不会执行cleanup()方法。

第二种:
配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><bean id="destory-two" class="org.spring.test.BeanDestoryDemo2"><property name="message" value="这里是配置文件中为message赋值"></property></bean>
</beans>

BeanDestoryDemo2类:

package org.spring.test;import org.springframework.beans.factory.DisposableBean;public class BeanDestoryDemo2 implements DisposableBean{private String message;public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public void destroy() throws Exception {// TODO Auto-generated method stubSystem.out.println("同样,销毁之前调用的方法");}
}

测试:

package org.spring.test;import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class DestortTest {public static void main(String[] args) {AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");BeanDestoryDemo2 bdd = (BeanDestoryDemo2) context.getBean("destory-two");System.out.println(bdd.getMessage());context.registerShutdownHook();}
}

运行结果:

Spring可以管理singleton作用域(默认的)的Bean的生命周期,所以在Bean初始化及销毁之前可以做一些工作,更灵活的管理Bean。

spring之Bean的生命周期相关推荐

  1. Spring 中 Bean 的生命周期

    本文作者: 伯乐在线 - yemengying 智商捉鸡?,实在没办法一下子理解Spring IoC和AOP的实现原理,看的闹心也不太懂,所以...决定拆成小的不能在小的一个个问题,一点点啃.今天先来 ...

  2. 如果你每次面试前都要去背一篇Spring中Bean的生命周期,请看完这篇文章

    前言 当你准备去复习Spring中Bean的生命周期的时候,这个时候你开始上网找资料,很大概率会看到下面这张图: 先不论这张图上是否全面,但是就说这张图吧,你是不是背了又忘,忘了又背? 究其原因在于, ...

  3. 面试问题:Spring中Bean 的生命周期

    Spring Bean生命周期执行流程 在传统的 Java 应用中,Bean 的生命周期很简单,使用关键字 new 实例化 Bean,当不需要该 Bean 时,由 Java 自动进行垃圾回收. Spr ...

  4. 深究Spring中Bean的生命周期

    前言 这其实是一道面试题,是我在面试百度的时候被问到的,当时没有答出来(因为自己真的很菜),后来在网上寻找答案,看到也是一头雾水,直到看到了<Spring in action>这本书,书上 ...

  5. (十)Spring中Bean的生命周期(下)

    Spring官网阅读(十)Spring中Bean的生命周期(下) 在上篇文章中,我们已经对Bean的生命周期做了简单的介绍,主要介绍了整个生命周期中的初始化阶段以及基于容器启动停止时LifeCycle ...

  6. spring --(12)bean的生命周期

    2019独角兽企业重金招聘Python工程师标准>>> springIOC容器可以管理bean的生命周期,管理过程: 1>通过构造器或工厂方法创建bean实例 2>给be ...

  7. Spring中Bean的生命周期是怎样的

    于普通的Java对象,当new的时候创建对象,当它没有任何引用的时候被垃圾回收机制回收.而由Spring IoC容器托管的对象,它们的生命周期完全由容器控制.Spring中每个Bean的生命周期如下: ...

  8. 【Spring】Bean的生命周期

    Spring Bean是Spring应用中最最重要的部分了.所以来看看Spring容器在初始化一个bean的时候会做那些事情,顺序是怎样的,在容器关闭的时候,又会做哪些事情. 示例代码 git地址: ...

  9. Spring核心——Bean的生命周期

    文章目录 序言 一:Bean生命周期流程图 二:测试方法以及步骤 1.创建一个bean 2.创建BeanFactoryPostProcessor 的实现实例 3.创建InstantiationAwar ...

  10. Spring中Bean的生命周期是怎样的?

    对于普通的Java对象,当new的时候创建对象,当它没有任何引用的时候被垃圾回收机制回收.而由Spring IoC容器托管的对象,它们的生命周期完全由容器控制.Spring中每个Bean的生命周期如下 ...

最新文章

  1. MinGW-w64 编译器下载,安装,以及环境变量配置
  2. hibernate相关收集
  3. 王者荣耀AI绝悟如何选英雄?腾讯AI Lab新研究揭秘
  4. 世纪联华的 Serverless 之路
  5. 西部数据硬盘支持linux,西部数据开发新的Linux文件系统“Zonefs” 支持在分区块设备上运行...
  6. 陕师大计算机专业,陕师大计算机系组合数学试题
  7. 苹果隐私追踪新规发布后 Android广告支出涨10%
  8. Linux网络编程复习笔记
  9. 论文赏析【EMNLP19】语言模型效果不好?也许你可以给它添加一点句法信息
  10. python模块-re模块
  11. 【pandas】dataframe根据某列是否是null筛选数据
  12. 22. linux 日志分析
  13. paip.获取地理位置根据Ip
  14. java密码验证代码_java用户名密码验证示例代码分享
  15. 数学分析思维导图整理(四)单变量积分学
  16. EPS学习笔记2----------常用地物绘制基础
  17. 计算机高中会考inpute,高中信息技术会考知识点
  18. PLC气动机械手控制系统毕业设计【附带仿真】
  19. linux文件最大访问数,测试Linux最大打开文件数参数
  20. 硬盘柱面损坏怎么办_硬盘有坏道怎么修复?使用DiskGenius修复硬盘逻辑坏道的方法...

热门文章

  1. 李彦宏发布内部信:宣布升级百度“云+AI”战略
  2. 七夕来临!来支付宝“结个婚”吧 全国5个省市可用
  3. 消息称小米之家全面取消员工销售提成 回应:内容严重偏颇失实
  4. 黄章:魅族16s真机非常漂亮 网曝图片与实机相差甚远
  5. 毛谦解读“Pb/s级光传输”:技术的恩惠远不止于此
  6. 「十年老测试」测试员的职场之路
  7. es创建索引设置字段不分词_java整合es指定字段不分词搜索
  8. linux ssh和sftp区别,Linux SSH和SFTP配置
  9. python自动化测试框架有哪几种_Python自动化测试-Unittest单元测试框架详解
  10. puppeteer 自动化测试 一