返回顶部
首页 > 资讯 > 后端开发 > JAVA >【Spring】Spring的Bean的生命周期
  • 471
分享到

【Spring】Spring的Bean的生命周期

javaBean生命周期spring 2023-08-17 13:08:17 471人浏览 独家记忆
摘要

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

--结束END--

本文标题: 【Spring】Spring的Bean的生命周期

本文链接: https://lsjlt.com/news/372861.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 【Spring】Spring的Bean的生命周期
    作者简介:大家好,我是五度鱼,一个普通的Java领域博主,不停输出Java技术博客和干货。座右铭:锲而不舍,金石可镂。个人主页:五度鱼学Java的主页 文章目录 前言1. 什么是Bean的生命周期?2. 为什么要知道Bean...
    99+
    2023-08-17
    java Bean生命周期 spring
  • Spring Bean的生命周期 -- Spring入门(三)
    文章目录 前言1. 理解bean的生命周期2. Bean 生命周期的执行过程3. Bean生命周期控制入门案例4. 关闭IOC容器的两种方式5. 通过继承接口绑定生命周期方法 总结 前言 为了巩固所学的知识,作者尝试着开始...
    99+
    2023-08-17
    spring java 后端
  • Spring 中 Bean 的生命周期详解
    目录前言1.Bean 生命周期2.代码演示总结前言 Java 中的公共类称之为 Bean 或 Java Bean,而 Spring 中的 Bean 指的是将对象的生命周期,交个 Sp...
    99+
    2024-04-02
  • spring之Bean的生命周期详解
    Bean的生命周期:Bean的定义——Bean的初始化——Bean的使用——Bean的销毁Bean的定义Bean 是 spring 装配的组件模型,一切实体类都可以配置成一个 Bean ,进而就可以在任何其他的 Bean 中使用,一个 Be...
    99+
    2023-05-31
    spring bean 生命周期
  • Spring Bean的生命周期是什么
    这篇“Spring Bean的生命周期是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring ...
    99+
    2023-07-05
  • Spring bean的生命周期是什么
    Spring bean的生命周期包括以下阶段:1. 实例化(Instantiation):在容器启动时,Spring根据配置信息或注...
    99+
    2023-08-24
    Spring bean
  • Spring Bean生命周期,好像人的一生。。
    大家好,我是老三,上节我们手撸了一个简单的IOC容器五分钟,手撸一个Spring容器!,这节我们来看一看Spring中Bean的生命周期,我发现,和人的一生真的很像。 简单说说IoC和Bean IoC...
    99+
    2023-09-27
    spring java 后端
  • spring中bean的生命周期是什么
    在Spring中,Bean的生命周期包括以下几个阶段:1. 实例化:当Spring容器接收到请求时,根据配置文件或注解等方式,在内存...
    99+
    2023-09-27
    spring bean
  • Spring创建Bean的生命周期详析
    目录1.Bean 的创建生命周期2.Spring AOP 大致流程3.Spring 事务4.Spring 源码阅读前戏BeanDefinitionBeanDefinitionRead...
    99+
    2024-04-02
  • 深入了解Spring的Bean生命周期
    目录源码下载什么是 Spring Bean 的生命周期Bean的生命周期Spring角度查看bean的定义与注册SpringBoot角度查看bean定义和注册实例化,依赖注入,初始化...
    99+
    2024-04-02
  • Spring中bean的生命周期有多长
    这篇文章主要介绍“Spring中bean的生命周期有多长”,在日常操作中,相信很多人在Spring中bean的生命周期有多长问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Spring中bean的生命周期有多长...
    99+
    2023-06-02
  • 怎样理解Spring Bean生命周期
    怎样理解Spring Bean生命周期,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在网上已经有跟多Bean的生命周期的博客,但是很多都是基于比较老的版本了,最近把整个流程...
    99+
    2023-06-16
  • Spring Bean生命周期源码分析
    这篇“Spring Bean生命周期源码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring ...
    99+
    2023-07-05
  • Spring的生命周期
    Spring的生命周期 Spring框架是一个非常流行的Java企业级开发框架,它提供了很多强大的功能,包括依赖注入、AOP、事务管理等。在使用Spring框架时,了解Spring的生命周期非常重要,可以帮助我们更好地理解Spring框架...
    99+
    2023-09-06
    面试 java Powered by 金山文档
  • Spring源码解析之Bean的生命周期
    一、Bean的实例化概述 前一篇分析了BeanDefinition的封装过程,最终将beanName与BeanDefinition以一对一映射关系放到beanDefinitionMa...
    99+
    2024-04-02
  • Spring中bean的生命周期之getSingleton方法
    Spring中bean的生命周期 要想讲清楚spring中bean的生命周期,真的是不容易,以AnnotationConfigApplicationContext上下文为基础来讲解b...
    99+
    2024-04-02
  • 一文搞懂Spring中Bean的生命周期
    目录一、使用配置生命周期的方法二、生命周期控制——接口控制(了解)小结生命周期:从创建到消亡的完整过程 bean声明周期:bean从创建到销毁的整体过程 be...
    99+
    2024-04-02
  • 如何掌握Spring中bean的生命周期!
    这期内容当中小编将会给大家带来有关如何掌握Spring中bean的生命周期!,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Spring 中bean 的生命周期短暂吗在spring中,从BeanFactor...
    99+
    2023-06-17
  • Spring bean生命周期知识点讲解
    这篇文章主要讲解了“Spring bean生命周期知识点讲解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring bean生命周期知识点讲解”吧!前言任何一个事物都有自己的生命周期,生...
    99+
    2023-05-30
    spring
  • 怎么深入了解Spring的Bean生命周期
    本篇文章为大家展示了怎么深入了解Spring的Bean生命周期,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。什么是 Spring Bean 的生命周期对于普通的 Java 对象,当 new 的时候创...
    99+
    2023-06-26
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作