简介:

在spring世界中,一切皆为bean,spring是面向bean编程的,bean也可以称为组件,是一个个java对象,多个组件间协调工作完成复杂的业务功能。

所以理解bean的生命周期,方便在每个时期可以执行一些特定的操作是十分重要的。
这里的bean指的是单例bean,原型bean一旦从容器中获取出去生命周期就不归容器管理了。

默认的生命周期:

spring中bean有五个默认的生命周期(顺序由上到下):

  • 实例创建阶段:就是使用构造器进行实例创建的阶段。
  • 依赖注入阶段:也就是属性赋值阶段。
  • 初始化阶段:可以在依赖注入结束后执行指定的初始化方法。
  • 使用阶段:bean正常使用。
  • 销毁阶段:bean从容器中移除或者容器销毁或者关闭时可以执行特性的方法。

demo:

package com.cong.springdemo;public class Person {private String name;private Integer age;public Person() {System.out.println("第一步:创建实例");}public String getName() {return name;}public void setName(String name) {System.out.println("第二步:依赖注入阶段");this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "第四步:使用阶段:Person [name=" + name + ", age=" + age + "]";}//初始化方法,会在依赖注入结束后由调用public void init() {System.out.println("第三步:初始化");}//销毁方法。会在bean从容器中移除或者容器销毁或者关闭时执行。public void destroy() {System.out.println("第五步:销毁");}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 使用 init-method执行初始化方法 ,使用destroy-method指定销毁方法--><bean id="person1" class="com.cong.springdemo.Person" init-method="init" destroy-method="destroy"><property name="name" value="Tom"></property><property name="age" value="18"></property></bean></beans>

测试:

public class Test {public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");Person person = (Person) context.getBean("person1");System.out.println(person);//关闭容器context.close();}
}

执行结果:

除了在xml指定初始化方法和销毁方法,还可以让类实现InitializingBean接口并重写初始化方法,实现DisposableBean方法重写销毁方法实现一样的事情。

基于后置处理器BeanPostProcessor的生命周期

可以定义一个后置处理器实现BeanPostProcessor并重写里面的两个方法,可以在bean的默认生命周期中多加两个时期,一个是在依赖注入后,初始化方法执行前,一个是在初始化方法执行后执行。

这就可以实现生命周期的七个时期(顺序由上到下):

  • 实例创建阶段:就是使用构造器进行实例创建的阶段。
  • 依赖注入阶段:也就是属性赋值阶段。
  • 后置处理器实现的时期。
  • 初始化阶段:可以在依赖注入结束后执行指定的初始化方法。
  • 后置处理器实现的时期。
  • 使用阶段:bean正常使用。
  • 销毁阶段:bean从容器中移除或者容器销毁或者关闭时可以执行特性的方法。

demo:

public class MyPostProcess implements BeanPostProcessor{//会在bean的初始化方法之后执行@Override/*** bean:要处理的bean,必须返回这个,供后面的生命周期使用。* beanName:bean id*/public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("第五步:后置处理器在初始化后执行");return bean;}//会在bean的初始化方法之前执行@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("第三步:后置处理器在初始化前执行");return bean;}}public class Person{private String name;private Integer age;public Person() {System.out.println("第一步:创建实例");}public String getName() {return name;}public void setName(String name) {System.out.println("第二步:依赖注入阶段");this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "第六步:使用阶段:Person [name=" + name + ", age=" + age + "]";}//初始化方法,会在依赖注入结束后由调用public void init() {System.out.println("第四步:初始化");}//销毁方法。会在bean从容器中移除或者容器销毁或者关闭时执行。public void destroy() {System.out.println("第七步:销毁");}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 使用 init-method执行初始化方法 ,使用destroy-method指定销毁方法--><bean id="person1" class="com.cong.springdemo.Person" init-method="init" destroy-method="destroy"><property name="name" value="Tom"></property><property name="age" value="18"></property></bean><!-- 后置处理器也要创建实例bean --><bean class="com.cong.springdemo.MyPostProcess"></bean></beans>

测试:

public class Test {public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");Person person = (Person) context.getBean("person1");System.out.println(person);//关闭容器context.close();}
}

结果:

**总结:**要了解spring 容器bean的生命周期,使得可以在每个时期做一些特定是事情。

Spring高级应用之bean的生命周期相关推荐

  1. Spring全家桶(四)Bean的生命周期

    十.Bean生命周期 10.1 Bean的生命周期 Spring IOC容器可以管理Bean的生命周期,也允许在Bean生命周期的特定点执行定制的任务. Spring IOC容器对Bean的生命周期进 ...

  2. Spring容器启动流程+Bean的生命周期【附源码】

    如果对SpringIoc与Aop的源码感兴趣,可以访问参考:https://javadoop.com/,十分详细. 文章目录 Spring容器的启动全流程 Spring容器关闭流程 Bean 的生命周 ...

  3. Spring学习总结1——bean的生命周期

    为什么80%的码农都做不了架构师?>>>    Spring实际上是一个容器框架,可以配置各种bean(action/service/domain/dao...),并且可以维护bea ...

  4. Spring源码分析——Bean的生命周期

    文章目录 说明 测试代码 说明 本文从源码的角度分析Spring中Bean的加载过程,本文使用的Spring版本为4.3.25.RELEASE 测试代码 测试代码如下,根据这段简单的测试代码,一步步跟 ...

  5. spring入门第二讲 bean的生命周期 装配方式 Spring整合Junit

    bean的生命周期 实体类 //初始化 public void init(){System.out.println("--初始化--"); }//销毁 public void de ...

  6. Spring源码深度解析,Spring源码以及Bean的生命周期(五)(附代码示例:)

    五)Bean 的生命周期,创建---初始化---销毁的过程 目录 五)Bean 的生命周期,创建---初始化---销毁的过程 一 ,  指定初始化方法 init-method 方法​ 二 ,指定销毁 ...

  7. Spring源码学习--Bean的生命周期

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

  8. Spring:IOC容器Bean的生命周期的int和destro方法详解(4)

    Bean的生命周期 1)实例化Bean 对于BeanFactory容器,当客户向容器请求一个未初始化的bean时,或初始化bean的时候需要注入另一个未初始化的依赖时,容器就会调用createBean ...

  9. Spring《二》 Bean的生命周期

    Bean初始化 1.bean中实现public void init():方法,config.xml中增加init-method="init" 属性. 2.bean实现接口Initi ...

最新文章

  1. 【深度学习】超级赞!N个神经网络可视化利器
  2. SLAM学习策略和前期准备
  3. Swift-EasingAnimation
  4. 助力移动AR应用发展,阿里巴巴推出AR开放平台
  5. 小学 学生学籍信息汇总及自动检查代码(Python)
  6. 多么漂亮的重载构造方法呀!爱上.net
  7. 卸载ruby on rails
  8. java如何抽离_「小程序JAVA实战」 小程序抽离公用方法进行模块化(12)
  9. linux rz命令安装
  10. 王树尧老师运筹学课程笔记 07 线性规划与单纯形法(标准型、基、基解、基可行解、可行基)
  11. SQL Server数据类型一览表
  12. Deep Learning for Image and Point Cloud Fusionin Autonomous Driving: A Review
  13. AI--调用百度OCR文字识别API进行图片文字识别
  14. HTTP Live Streaming(HLS)详解
  15. 安装Oracle 19c 的系统配置要求
  16. 90后在虚拟世界建国风园林,完美融合数字艺术与传统诗词
  17. C语言--小学生计算机辅助教学系统
  18. 做快乐的程序员 - 李战 在淘宝网的一次讲座
  19. Kotlin 注解全解析
  20. html播放韰 寸 频,js根据文字获取首字母案例,直接复制在html中即可查看效果

热门文章

  1. Python学习笔记:利用Pyforest导入本地已安装的库
  2. 9.广义霍夫变换——广义霍夫变换算法和识别中的应用、现在的霍夫算法及识别中的应用_2
  3. 和电商有关的词语_电商描写的词语 形容“电”的词语有哪些?
  4. cpp mqtt paho 使用_MQTT--Paho C Client 的实现和详解
  5. bzoj2462 [BeiJing2011]矩阵模板 hash
  6. 移动开发-语音识别-调用讯飞平台提供的API
  7. 性能测试、 障碍条件和回滚
  8. centos6.0安装中文输入法
  9. Unity网络--HLAPI(1):服务器客户端变量同步,脏标识以及定制特性SyncVar
  10. CLion 中使用 clang-format