Spring Bean生命周期过程

Spring Bean生命周期指的是Bean加载Spring容器的过程,单例的Bean与多例的Bean加载过程是不一样的。这里指的是单例Bean的加载过程。

图:Spring Bean生命周期的过程(十一个步骤)

Spring Bean 生命周期过程描述(重要的是第5步、第7步)

第一步,Bean 容器找到配置文件中 Spring Bean 的定义。

第二步,Bean 容器利用 Java Reflection API 创建一个Bean的实例。

如果涉及到一些属性值 利用 set() 方法设置一些属性值。

第三步,如果 Bean 实现了BeanNameAware接口,调用setBeanName()方法,传入Bean的名字。

第四步,如果 Bean 实现了BeanClassLoaderAware接口,调用setBeanClassLoader()方法,传入ClassLoader 对象的实例。与上面的类似,如果实现了其他 *.Aware 接口,就调用相应的方法。

补充:如果Bean实现ApplicationContextAware设置工厂setBeanFactory或者上下文对象setApplicationContext

第五步,如果存在实现 Bean 的 Spring 容器相关的BeanPostProcessor(后处理Bean)对象,执 行postProcessBeforeInitialization()方法

第六步,如果Bean实现了InitializingBean接口,执行afterPropertiesSet()方法。

第七步(两种情况),如果 Bean 在配置文件中的定义包含init-method属性,执行指定的方法。
或者如果存在类实现BeanPostProcessor(处理Bean)执行postProcessAfterInitialization

比如:调用<bean init-method="name">指定初始化方法init。

第八步,执行业务处理。

第九步,当要销毁 Bean 的时候,如果 Bean 实现了 DisposableBean 接口,执行 destroy() 方法。

第十步,当要销毁 Bean 的时候,如果 Bean 在配置文件中的定义包含 destroy-method 属性,执行指 定的方法。

比如:存在<bean destroy-method="name">指定销毁方法。

代码演示执行过程:
Man

public class Man implements BeanNameAware,ApplicationContextAware,InitializingBean,DisposableBean{private String name;public void setName(String name) {System.out.println("第二步:设置属性");this.name = name;}public Man(){System.out.println("第一步:初始化...");}public void setup(){System.out.println("第七步:MAN被初始化了...");}public void teardown(){System.out.println("第十一步:MAN被销毁了...");}@Overridepublic void setBeanName(String name) {System.out.println("第三步:设置Bean的名称"+name);}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {System.out.println("第四步:了解工厂信息");}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("第六步:属性设置后");}public void run(){System.out.println("第九步:执行业务方法");}@Overridepublic void destroy() throws Exception {System.out.println("第十步:执行Spring的销毁方法");}
}

MyBeanPostProcessor

public class MyBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("第五步:初始化前方法...");return bean;}@Overridepublic Object postProcessAfterInitialization(final Object bean, String beanName) throws BeansException {System.out.println("第八步:初始化后方法...");return bean;}
}

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:p="http://www.springframework.org/schema/p"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="man" class="Man" init-method="setup" destroy-method="teardown"><property name="name" value="张三"/></bean><!-- 第八步,执行业务逻辑--><bean class="MyBeanPostProcessor"/>
</beans>

测试方法

    @Testpublic void demo2(){ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");Man man = (Man)applicationContext.getBean("man");man.run();applicationContext.close();}

测试结果

第一步:初始化...
第二步:设置属性
第三步:设置Bean的名称man
第四步:了解工厂信息
第五步:初始化前方法...
第六步:属性设置后
第七步:MAN被初始化了...
第八步:初始化后方法...
第九步:执行业务方法
16:30:22,509  INFO ClassPathXmlApplicationContext:960 - Closing org.springframework.context.support.ClassPathXmlApplicationContext@769c9116: startup date [Fri May 14 16:30:22 CST 2021]; root of context hierarchy
第十步:执行Spring的销毁方法
第十一步:MAN被销毁了...

如果要对某个方法进行增强,可以这样做:

   <bean id="man" class="Man" init-method="setup" destroy-method="teardown"><property name="name" value="张三"/></bean><bean class="MyBeanPostProcessor"/><bean id="userDao" class="UserDaoImpl"/>
public interface UserDao {public void findAll();public void save();public void update();public void delete();
}
public class UserDaoImpl implements  UserDao {@Overridepublic void findAll() {System.out.println("查询用户。。。");}@Overridepublic void save() {System.out.println("保存用户。。。");}@Overridepublic void update() {System.out.println("修改用户。。。");}@Overridepublic void delete() {System.out.println("删除用户。。。");}
}

对save方法进行增强。

public class MyBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {//System.out.println("第五步:初始化前方法...");return bean;}@Overridepublic Object postProcessAfterInitialization(final Object bean, String beanName) throws BeansException {//System.out.println("第八步:初始化后方法...");if("userDao".equals(beanName)){Object proxy = Proxy.newProxyInstance(bean.getClass().getClassLoader(), bean.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if("save".equals(method.getName())){System.out.println("权限校验===================");return method.invoke(bean,args);}return method.invoke(bean,args);}});return proxy;}else{return bean;}}
}
    @Testpublic void demo3(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");UserDao userDao = (UserDao)applicationContext.getBean("userDao");userDao.findAll();userDao.save();userDao.update();userDao.delete();}

测试结果:

第一步:初始化...
第二步:设置属性
第三步:设置Bean的名称man
第四步:了解工厂信息
第六步:属性设置后
第七步:MAN被初始化了...
查询用户。。。
权限校验===================
保存用户。。。
修改用户。。。
删除用户。。。

Spring Bean生命周期过程相关推荐

  1. Spring Bean生命周期: Bean的实例化

    [Spring Bean 生命周期系列]传送门 1.Spring Bean生命周期: Bean元信息的配置与解析阶段 2.Spring Bean生命周期: Bean的注册 3.Spring Bean生 ...

  2. Spring Bean生命周期:Bean的初始化阶段

    [Spring Bean 生命周期系列]传送门 1.Spring Bean生命周期: Bean元信息的配置与解析阶段 2.Spring Bean生命周期: Bean的注册 3.Spring Bean生 ...

  3. Spring5源码 - 07 Spring Bean 生命周期流程 源码解读02

    文章目录 Pre 通俗流程 finishBeanFactoryInitialization Pre Spring5源码 - 06 Spring Bean 生命周期流程 概述 01 接上文 通俗流程 下 ...

  4. Spring Bean默认配置为单实例 Spring Bean生命周期

    2019独角兽企业重金招聘Python工程师标准>>> Spring 的Bean默认的是单例的. 如果不想单例需要如下配置: <bean id="user" ...

  5. Spring框架:三种Spring Bean生命周期技术

    当使用术语"生命周期"时,Spring的家伙指的是您的bean的构造和破坏,通常这与Spring Context的构造和破坏有关. 在某些情况下,Bean生命周期的管理不是一件容易 ...

  6. Spring Bean 生命周期之“我从哪里来”?懂得这个很重要

    Spring bean 的生命周期很容易理解.实例化 bean 时,可能需要执行一些初始化以使其进入可用 (Ready for Use)状态.类似地,当不再需要 bean 并将其从容器中移除时,可能需 ...

  7. Spring5源码 - 06 Spring Bean 生命周期流程 概述 01

    文章目录 Bean生命周期概述 Demo finishBeanFactoryInitialization(beanFactory) 核心流程 Bean生命周期概述 说到Spring Bean的生命周期 ...

  8. spring bean生命周期_Spring中bean的生命周期和扩展点有哪些?

    前言 今天和大家分享一下Spring中Bean的生命周期的一些知识.先来说一下什么是生命周期吧,生命周期从其语义上理解就是一个对象从产生到销毁的整个过程,之所以把这个过程称为生命周期是因为其就像一个生 ...

  9. Spring Bean生命周期,就像人的一生

    这篇我们来看一看Spring中Bean的生命周期,我发现,和人的一生真的很像. 1 简单说说IoC和Bean IoC,控制反转,想必大家都知道,所谓的控制反转,就是把new对象的权利交给容器,所有的对 ...

最新文章

  1. 图解CAN总线数据的组成和帧格式
  2. python3.7如何安装库_Python3.7版库的安装以及常用方法(十分简单)
  3. CIC滤波器的Matlab仿真与FPGA实现
  4. 背景减除(Background Segment)
  5. python压平嵌套列表
  6. git add -A 和 git add . 的区别
  7. 如何在云服务器上安装vim(bash: vim :command not found)
  8. php默认语法,php语法基本规则
  9. 【JSP开发】有关session的一些重要的知识点
  10. 鼠标侧键能改为ctrl吗_200元档次又一高竞争力外设 雷柏V30鼠标评测
  11. 怎样把Linux的私钥文件id_rsa转换成putty的ppk格式
  12. HSRP热备份路由协议配置详解
  13. NOIP2020退役记
  14. 基于微信小程序的图书馆管理系统.rar(论文+源码)
  15. 自动控制原理 (二): 控制系统的微分方程
  16. PR曲线(ROC曲线)是如何画出来的?
  17. html字体图标设置
  18. 5个典型实例告诉你:什么是数据可视化
  19. spa单页面开发的尝试
  20. 38条搞笑WOW下线理由。。。 达人火速添加啊

热门文章

  1. 基于知识图谱的多模内容创作技术
  2. 计算机翻译图片,如何将电脑图片中的文字翻译成英文
  3. x265代码阅读:码率控制(一)
  4. 数据分析总结四:可视化与数据分析
  5. 自动控制原理(根轨迹)
  6. android开发常用的ADB命令
  7. 操作系统:Java模拟CPU调度算法(非抢占短进程优先、可抢占优先权调度、多级反馈队列调度)
  8. 为什么那么多的人选择到Java培训机构学习
  9. 6D模型:超越PDCA
  10. NLP | textCNN textRNN 图文详解及代码