Spring Bean生命周期过程
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生命周期过程相关推荐
- Spring Bean生命周期: Bean的实例化
[Spring Bean 生命周期系列]传送门 1.Spring Bean生命周期: Bean元信息的配置与解析阶段 2.Spring Bean生命周期: Bean的注册 3.Spring Bean生 ...
- Spring Bean生命周期:Bean的初始化阶段
[Spring Bean 生命周期系列]传送门 1.Spring Bean生命周期: Bean元信息的配置与解析阶段 2.Spring Bean生命周期: Bean的注册 3.Spring Bean生 ...
- Spring5源码 - 07 Spring Bean 生命周期流程 源码解读02
文章目录 Pre 通俗流程 finishBeanFactoryInitialization Pre Spring5源码 - 06 Spring Bean 生命周期流程 概述 01 接上文 通俗流程 下 ...
- Spring Bean默认配置为单实例 Spring Bean生命周期
2019独角兽企业重金招聘Python工程师标准>>> Spring 的Bean默认的是单例的. 如果不想单例需要如下配置: <bean id="user" ...
- Spring框架:三种Spring Bean生命周期技术
当使用术语"生命周期"时,Spring的家伙指的是您的bean的构造和破坏,通常这与Spring Context的构造和破坏有关. 在某些情况下,Bean生命周期的管理不是一件容易 ...
- Spring Bean 生命周期之“我从哪里来”?懂得这个很重要
Spring bean 的生命周期很容易理解.实例化 bean 时,可能需要执行一些初始化以使其进入可用 (Ready for Use)状态.类似地,当不再需要 bean 并将其从容器中移除时,可能需 ...
- Spring5源码 - 06 Spring Bean 生命周期流程 概述 01
文章目录 Bean生命周期概述 Demo finishBeanFactoryInitialization(beanFactory) 核心流程 Bean生命周期概述 说到Spring Bean的生命周期 ...
- spring bean生命周期_Spring中bean的生命周期和扩展点有哪些?
前言 今天和大家分享一下Spring中Bean的生命周期的一些知识.先来说一下什么是生命周期吧,生命周期从其语义上理解就是一个对象从产生到销毁的整个过程,之所以把这个过程称为生命周期是因为其就像一个生 ...
- Spring Bean生命周期,就像人的一生
这篇我们来看一看Spring中Bean的生命周期,我发现,和人的一生真的很像. 1 简单说说IoC和Bean IoC,控制反转,想必大家都知道,所谓的控制反转,就是把new对象的权利交给容器,所有的对 ...
最新文章
- 图解CAN总线数据的组成和帧格式
- python3.7如何安装库_Python3.7版库的安装以及常用方法(十分简单)
- CIC滤波器的Matlab仿真与FPGA实现
- 背景减除(Background Segment)
- python压平嵌套列表
- git add -A 和 git add . 的区别
- 如何在云服务器上安装vim(bash: vim :command not found)
- php默认语法,php语法基本规则
- 【JSP开发】有关session的一些重要的知识点
- 鼠标侧键能改为ctrl吗_200元档次又一高竞争力外设 雷柏V30鼠标评测
- 怎样把Linux的私钥文件id_rsa转换成putty的ppk格式
- HSRP热备份路由协议配置详解
- NOIP2020退役记
- 基于微信小程序的图书馆管理系统.rar(论文+源码)
- 自动控制原理 (二): 控制系统的微分方程
- PR曲线(ROC曲线)是如何画出来的?
- html字体图标设置
- 5个典型实例告诉你:什么是数据可视化
- spa单页面开发的尝试
- 38条搞笑WOW下线理由。。。 达人火速添加啊