我的编程空间,编程开发者的网络收藏夹
学习永远不晚

【Spring】Spring的Bean的生命周期

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

【Spring】Spring的Bean的生命周期

img

  • 作者简介:大家好,我是五度鱼,一个普通的Java领域博主,不停输出Java技术博客和干货
  • 座右铭:锲而不舍,金石可镂
  • 个人主页:五度鱼学Java的主页

前言

Java中,Bean是一个重要的概念,它代表了应用程序中的一个对象。在开发中,我们经常使用Bean来管理对象的生命周期。本文将介绍Bean的生命周期,并详细讲解如何在Spring框架中管理Bean的生命周期。

在这里插入图片描述


1. 什么是Bean的生命周期?

Spring其实就是一个管理Bean对象的工厂。它负责对象的创建,对象的销毁等。

所谓的生命周期就是:对象从创建开始到最终销毁的整个过程。Spring为每个Bean定义了若干个回调方法,使得开发人员可以在某个特定的时间点对Bean进行特定的操作。

2. 为什么要知道Bean的生命周期?

其实生命周期的本质是:在哪个时间节点上调用了哪个类的哪个方法。

我们需要充分的了解在这个生命线上,都有哪些特殊的时间节点。

只有我们知道了特殊的时间节点都在哪,到时我们才可以确定代码写到哪。

我们可能需要在某个特殊的时间点上执行一段特定的代码,这段代码就可以放到这个节点上。当生命线走到这里的时候,自然会被调用。

3. Bean的生命周期之5步

Bean生命周期的管理,可以参考Spring的源码:AbstractAutowireCapableBeanFactory类的doCreateBean()方法。`

Bean生命周期可以粗略的划分为五大步:

  • 第一步:实例化Bean
  • 第二步:Bean属性赋值
  • 第三步:初始化Bean
  • 第四步:使用Bean
  • 第五步:销毁Bean

img

编写测试程序:

定义一个Bean

package com.powernode.spring6.bean;public class User {    private String name;    public User() {        System.out.println("1.实例化Bean");    }    public void setName(String name) {        this.name = name;        System.out.println("2.Bean属性赋值");    }    public void initBean(){        System.out.println("3.初始化Bean");    }    public void destroyBean(){        System.out.println("5.销毁Bean");    }}                    package com.powernode.spring6.test;import com.powernode.spring6.bean.User;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class BeanLifecycleTest {    @Test    public void testLifecycle(){        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");        User userBean = applicationContext.getBean("userBean", User.class);        System.out.println("4.使用Bean");        // 只有正常关闭spring容器才会执行销毁方法        ClassPathXmlApplicationContext context = (ClassPathXmlApplicationContext) applicationContext;        context.close();    }}

执行结果:

img

需要注意的:

  • 第一:只有正常关闭spring容器,bean的销毁方法才会被调用。
  • 第二:ClassPathXmlApplicationContext类才有close()方法。
  • 第三:配置文件中的init-method指定初始化方法。destroy-method指定销毁方法。

4. Bean的生命周期之7步

在以上的5步中,第3步是初始化Bean,如果你还想在初始化前和初始化后添加代码,可以加入“Bean后处理器”。

编写一个类实现BeanPostProcessor类,并且重写before和after方法:

package com.powernode.spring6.bean;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanPostProcessor;public class LogBeanPostProcessor implements BeanPostProcessor {    @Override    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {        System.out.println("Bean后处理器的before方法执行,即将开始初始化");        return bean;    }    @Override    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {        System.out.println("Bean后处理器的after方法执行,已完成初始化");        return bean;    }}

spring.xml文件中配置“Bean后处理器”:

一定要注意:在spring.xml文件中配置的Bean后处理器将作用于当前配置文件中所有的Bean

执行测试程序:

img

如果加上Bean后处理器的话,Bean的生命周期就是7步了:

img

5. Bean的生命周期之10步

如果根据源码跟踪,可以划分更细粒度的步骤,10步:

img

上图中检查Bean是否实现了Aware的相关接口是什么意思?

Aware相关的接口包括:BeanNameAwareBeanClassLoaderAwareBeanFactoryAware

  • Bean实现了BeanNameAwareSpring会将Bean的名字传递给Bean。
  • Bean实现了BeanClassLoaderAwareSpring会将加载该Bean的类加载器传递给Bean。
  • Bean实现了BeanFactoryAwareSpring会将Bean工厂对象传递给Bean

测试以上10步,可以让User类实现5个接口,并实现所有方法:

  • BeanNameAware
  • BeanClassLoaderAware
  • BeanFactoryAware
  • InitializingBean
  • DisposableBean

代码如下:

package com.powernode.spring6.bean;import org.springframework.beans.BeansException;import org.springframework.beans.factory.*;public class User implements BeanNameAware, BeanClassLoaderAware, BeanFactoryAware, InitializingBean, DisposableBean {    private String name;    public User() {        System.out.println("1.实例化Bean");    }    public void setName(String name) {        this.name = name;        System.out.println("2.Bean属性赋值");    }    public void initBean(){        System.out.println("6.初始化Bean");    }    public void destroyBean(){        System.out.println("10.销毁Bean");    }    @Override    public void setBeanClassLoader(ClassLoader classLoader) {        System.out.println("3.类加载器:" + classLoader);    }    @Override    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {        System.out.println("3.Bean工厂:" + beanFactory);    }    @Override    public void setBeanName(String name) {        System.out.println("3.bean名字:" + name);    }    @Override    public void destroy() throws Exception {        System.out.println("9.DisposableBean destroy");    }    @Override    public void afterPropertiesSet() throws Exception {        System.out.println("5.afterPropertiesSet执行");    }}package com.powernode.spring6.bean;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanPostProcessor;public class LogBeanPostProcessor implements BeanPostProcessor {    @Override    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {        System.out.println("4.Bean后处理器的before方法执行,即将开始初始化");        return bean;    }    @Override    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {        System.out.println("7.Bean后处理器的after方法执行,已完成初始化");        return bean;    }}

执行结果:

img

通过测试可以看出来:

  • InitializingBean的方法早于init-method的执行。
  • DisposableBean的方法早于destroy-method的执行。

对于SpringBean的生命周期,掌握之前的7步即可。够用。

6. Bean的作用域不同,管理方式不同

Spring 根据Bean的作用域来选择管理方式。

  • 对于singleton作用域的BeanSpring 能够精确地知道该Bean何时被创建,何时初始化完成,以及何时被销毁;
  • 而对于 prototype 作用域的BeanSpring 只负责创建,当容器创建了 Bean 的实例后,Bean 的实例就交给客户端代码管理,Spring 容器将不再跟踪其生命周期。

把之前User类的spring.xml文件中的配置scope设置为prototype

                            

执行测试程序:

img

通过测试一目了然。只执行了前8步,第9和10都没有执行。

7. 自己new的对象如何让Spring管理

有些时候可能会遇到这样的需求,某个java对象是我们自己new的,然后我们希望这个对象被Spring容器管理,怎么实现?

package com.powernode.spring6.bean;public class User {}package com.powernode.spring6.test;import com.powernode.spring6.bean.User;import org.junit.Test;import org.springframework.beans.factory.support.DefaultListableBeanFactory;public class RegisterBeanTest {    @Test    public void testBeanRegister(){        // 自己new的对象        User user = new User();        System.out.println(user);        // 创建 默认可列表BeanFactory 对象        DefaultListableBeanFactory factory = new DefaultListableBeanFactory();        // 注册Bean        factory.registerSingleton("userBean", user);        // 从spring容器中获取bean        User userBean = factory.getBean("userBean", User.class);        System.out.println(userBean);    }}

最后求个关注点赞收藏,谢谢!

来源地址:https://blog.csdn.net/qq_46096136/article/details/128780958

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

【Spring】Spring的Bean的生命周期

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

【Spring】Spring的Bean的生命周期

作者简介:大家好,我是五度鱼,一个普通的Java领域博主,不停输出Java技术博客和干货。座右铭:锲而不舍,金石可镂。个人主页:五度鱼学Java的主页 文章目录 前言1. 什么是Bean的生命周期?2. 为什么要知道Bean
2023-08-17

Spring Bean的生命周期 -- Spring入门(三)

文章目录 前言1. 理解bean的生命周期2. Bean 生命周期的执行过程3. Bean生命周期控制入门案例4. 关闭IOC容器的两种方式5. 通过继承接口绑定生命周期方法 总结 前言 为了巩固所学的知识,作者尝试着开始
2023-08-17

Spring Bean的生命周期是什么

这篇“Spring Bean的生命周期是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring Bean的生命周期是
2023-07-05

spring之Bean的生命周期详解

Bean的生命周期:Bean的定义——Bean的初始化——Bean的使用——Bean的销毁Bean的定义Bean 是 spring 装配的组件模型,一切实体类都可以配置成一个 Bean ,进而就可以在任何其他的 Bean 中使用,一个 Be
2023-05-31

Spring bean的生命周期是什么

Spring bean的生命周期包括以下阶段:1. 实例化(Instantiation):在容器启动时,Spring根据配置信息或注解等方式实例化bean对象。2. 属性赋值(Populate bean properties):Spring
2023-08-24

spring中bean的生命周期是什么

在Spring中,Bean的生命周期包括以下几个阶段:1. 实例化:当Spring容器接收到请求时,根据配置文件或注解等方式,在内存中创建Bean的实例。2. 属性赋值:Spring容器通过依赖注入的方式,将Bean的属性值注入到相应的属性
2023-09-27

Spring中bean的生命周期有多长

这篇文章主要介绍“Spring中bean的生命周期有多长”,在日常操作中,相信很多人在Spring中bean的生命周期有多长问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Spring中bean的生命周期有多长
2023-06-02

Spring Bean生命周期源码分析

这篇“Spring Bean生命周期源码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring Bean生命周期源码
2023-07-05

怎样理解Spring Bean生命周期

怎样理解Spring Bean生命周期,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在网上已经有跟多Bean的生命周期的博客,但是很多都是基于比较老的版本了,最近把整个流程
2023-06-16

如何掌握Spring中bean的生命周期!

这期内容当中小编将会给大家带来有关如何掌握Spring中bean的生命周期!,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Spring 中bean 的生命周期短暂吗在spring中,从BeanFactor
2023-06-17

Spring bean生命周期验证的示例分析

这篇文章主要为大家展示了“Spring bean生命周期验证的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Spring bean生命周期验证的示例分析”这篇文章吧。一、从源码注释看be
2023-05-30

Spring bean生命周期知识点讲解

这篇文章主要讲解了“Spring bean生命周期知识点讲解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring bean生命周期知识点讲解”吧!前言任何一个事物都有自己的生命周期,生
2023-05-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录