spring之Bean的生命周期
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的生命周期相关推荐
- Spring 中 Bean 的生命周期
本文作者: 伯乐在线 - yemengying 智商捉鸡?,实在没办法一下子理解Spring IoC和AOP的实现原理,看的闹心也不太懂,所以...决定拆成小的不能在小的一个个问题,一点点啃.今天先来 ...
- 如果你每次面试前都要去背一篇Spring中Bean的生命周期,请看完这篇文章
前言 当你准备去复习Spring中Bean的生命周期的时候,这个时候你开始上网找资料,很大概率会看到下面这张图: 先不论这张图上是否全面,但是就说这张图吧,你是不是背了又忘,忘了又背? 究其原因在于, ...
- 面试问题:Spring中Bean 的生命周期
Spring Bean生命周期执行流程 在传统的 Java 应用中,Bean 的生命周期很简单,使用关键字 new 实例化 Bean,当不需要该 Bean 时,由 Java 自动进行垃圾回收. Spr ...
- 深究Spring中Bean的生命周期
前言 这其实是一道面试题,是我在面试百度的时候被问到的,当时没有答出来(因为自己真的很菜),后来在网上寻找答案,看到也是一头雾水,直到看到了<Spring in action>这本书,书上 ...
- (十)Spring中Bean的生命周期(下)
Spring官网阅读(十)Spring中Bean的生命周期(下) 在上篇文章中,我们已经对Bean的生命周期做了简单的介绍,主要介绍了整个生命周期中的初始化阶段以及基于容器启动停止时LifeCycle ...
- spring --(12)bean的生命周期
2019独角兽企业重金招聘Python工程师标准>>> springIOC容器可以管理bean的生命周期,管理过程: 1>通过构造器或工厂方法创建bean实例 2>给be ...
- Spring中Bean的生命周期是怎样的
于普通的Java对象,当new的时候创建对象,当它没有任何引用的时候被垃圾回收机制回收.而由Spring IoC容器托管的对象,它们的生命周期完全由容器控制.Spring中每个Bean的生命周期如下: ...
- 【Spring】Bean的生命周期
Spring Bean是Spring应用中最最重要的部分了.所以来看看Spring容器在初始化一个bean的时候会做那些事情,顺序是怎样的,在容器关闭的时候,又会做哪些事情. 示例代码 git地址: ...
- Spring核心——Bean的生命周期
文章目录 序言 一:Bean生命周期流程图 二:测试方法以及步骤 1.创建一个bean 2.创建BeanFactoryPostProcessor 的实现实例 3.创建InstantiationAwar ...
- Spring中Bean的生命周期是怎样的?
对于普通的Java对象,当new的时候创建对象,当它没有任何引用的时候被垃圾回收机制回收.而由Spring IoC容器托管的对象,它们的生命周期完全由容器控制.Spring中每个Bean的生命周期如下 ...
最新文章
- MinGW-w64 编译器下载,安装,以及环境变量配置
- hibernate相关收集
- 王者荣耀AI绝悟如何选英雄?腾讯AI Lab新研究揭秘
- 世纪联华的 Serverless 之路
- 西部数据硬盘支持linux,西部数据开发新的Linux文件系统“Zonefs” 支持在分区块设备上运行...
- 陕师大计算机专业,陕师大计算机系组合数学试题
- 苹果隐私追踪新规发布后 Android广告支出涨10%
- Linux网络编程复习笔记
- 论文赏析【EMNLP19】语言模型效果不好?也许你可以给它添加一点句法信息
- python模块-re模块
- 【pandas】dataframe根据某列是否是null筛选数据
- 22. linux 日志分析
- paip.获取地理位置根据Ip
- java密码验证代码_java用户名密码验证示例代码分享
- 数学分析思维导图整理(四)单变量积分学
- EPS学习笔记2----------常用地物绘制基础
- 计算机高中会考inpute,高中信息技术会考知识点
- PLC气动机械手控制系统毕业设计【附带仿真】
- linux文件最大访问数,测试Linux最大打开文件数参数
- 硬盘柱面损坏怎么办_硬盘有坏道怎么修复?使用DiskGenius修复硬盘逻辑坏道的方法...
热门文章
- 李彦宏发布内部信:宣布升级百度“云+AI”战略
- 七夕来临!来支付宝“结个婚”吧 全国5个省市可用
- 消息称小米之家全面取消员工销售提成 回应:内容严重偏颇失实
- 黄章:魅族16s真机非常漂亮 网曝图片与实机相差甚远
- 毛谦解读“Pb/s级光传输”:技术的恩惠远不止于此
- 「十年老测试」测试员的职场之路
- es创建索引设置字段不分词_java整合es指定字段不分词搜索
- linux ssh和sftp区别,Linux SSH和SFTP配置
- python自动化测试框架有哪几种_Python自动化测试-Unittest单元测试框架详解
- puppeteer 自动化测试 一