spring之Bean的生命周期

news/2024/11/28 3:16:58/

文章目录

  • 一、Bean的生命周期之五步
    • 1、准备User类
    • 2、spring配置文件
    • 3、测试类
    • 4、运行结果
  • 二、Bean的生命周期之七步
    • 1、实现BeanPostProcessor类
    • 2、配置文件
    • 3、运行结果:
  • 三、Bean的生命周期之十步
    • 1、点位1
    • 2、点位2
    • 3、点位3
  • 四、Bean的作用域


一、Bean的生命周期之五步

Bean的生命周期按照粗略的五步的话:

  • 第一步:实例化Bean(调用无参数构造方法)
  • 第二步:Bean属性赋值(调用set方法)
  • 第三步:初始化Bean(调用Bean的init方法,需要自己写自己配)
  • 第四步:使用Bean
  • 第五步:销毁Bean(调用Bean的destory方法,需要自己写自己配

在这里插入图片描述

需要手动关闭spring容器

        //销毁Bean 必须手动关闭Spring容器ClassPathXmlApplicationContext context = (ClassPathXmlApplicationContext) applicationContext;context.close();

需要手动指定初始化方法和销毁方法

init-method="initBean" destroy-method="destroyBean"

1、准备User类

无参构造 name属性以及set方法

public class User {private String name;public void setName(String name) {System.out.println("第二步:给对象的属性赋值。");this.name = name;}public User() {System.out.println("第一步:无参数构造方法执行。");}public void initBean(){System.out.println("第三步:初始化Bean。");}public void destroyBean(){System.out.println("第五步:销毁Bean。");}
}

2、spring配置文件

<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="user" class="com.bjpowernode.spring.bean.User"init-method="initBean" destroy-method="destroyBean"><property name="name" value="小白"></property></bean>
</beans>

3、测试类

    @Testpublic void testBeanLifeCircle(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");User user = applicationContext.getBean("user", User.class);System.out.println("第四步:使用Bean:"+user);//销毁Bean 必须手动关闭Spring容器ClassPathXmlApplicationContext context = (ClassPathXmlApplicationContext) applicationContext;context.close();}

4、运行结果

在这里插入图片描述

二、Bean的生命周期之七步

在以上的五步中,第三步是初始化Bean,如果还想在初始化前和初始化后添加代码,可以加入”Bean后处理器“ ----”BeanPostProcessor“

Bean生命周期七步:

  • 第一步:实例化Bean(调用无参数构造方法)
  • 第二步:Bean属性赋值(调用set方法)
  • 第三步:执行”Bean后处理器“的before方法
  • 第四步:初始化Bean(调用Bean的init方法,需要自己写自己配)
  • 第五步:执行”Bean后处理器“的after方法
  • 第六步:使用Bean
  • 第七步:销毁Bean(调用Bean的destory方法,需要自己写自己配)
    在这里插入图片描述

1、实现BeanPostProcessor类

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

出现return 报错的现象可能是jdk版本太低 改为1.8即可

public class LogBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("第三步:执行”Bean后处理器“的before方法");return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("第五步:执行”Bean后处理器“的after方法");return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);}
}

2、配置文件

需要在配置文件中进行配置

注意:这个Bean后处理器将作用于整个配置文件中所有的Bean

<bean class="com.bjpowernode.spring.bean.LogBeanPostProcessor"></bean>

完整的:

<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean class="com.bjpowernode.spring.bean.LogBeanPostProcessor"></bean><bean id="user" class="com.bjpowernode.spring.bean.User"init-method="initBean" destroy-method="destroyBean"><property name="name" value="小白"></property></bean>
</beans>

3、运行结果:

在这里插入图片描述

三、Bean的生命周期之十步

比七步添加的三步在哪里?

  • 在”Bean后处理器“before方法之前(检查Bean是否实现了Aware的相关接口,并设置相关依赖)
  • 在”Bean后处理器“before方法之后(检查Bean是否实现了InitializingBean接口,并调用接口方法)
  • 销毁Bean之前或使用Bean之后(检查Bean是否实现了DisposableBean接口,并调用接口方法)
    添加的这三步的特点:都是在检查这个Bean是否实现了某些特定的接口,如果实现了这些接口,则spring容器会调用这些接口中的方法

1、点位1

实现BeanNameAware, BeanClassLoaderAware, BeanFactoryAware 接口

public class User implements BeanNameAware, BeanClassLoaderAware, BeanFactoryAware {private String name;public void setName(String name) {System.out.println("第二步:给对象的属性赋值。");this.name = name;}public User() {System.out.println("第一步:无参数构造方法执行。");}public void initBean(){System.out.println("第四步:初始化Bean。");}public void destroyBean(){System.out.println("第七步:销毁Bean。");}@Overridepublic void setBeanClassLoader(ClassLoader classLoader) {System.out.println("Bean这个类的加载器:"+classLoader);}@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {System.out.println("生产这个Bean的工厂对象是:"+beanFactory);}@Overridepublic void setBeanName(String name) {System.out.println("这个Bean的名字是:"+name);}
}

在这里插入图片描述

2、点位2

实现InitializingBean接口

public class User implements BeanNameAware, BeanClassLoaderAware, BeanFactoryAware, InitializingBean {public void setName(String name) {System.out.println("第二步:给对象的属性赋值。");}public User() {System.out.println("第一步:无参数构造方法执行。");}public void initBean(){System.out.println("第四步:初始化Bean。");}public void destroyBean(){System.out.println("第七步:销毁Bean。");}@Overridepublic void setBeanClassLoader(ClassLoader classLoader) {System.out.println("Bean这个类的加载器:"+classLoader);}@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {System.out.println("生产这个Bean的工厂对象是:"+beanFactory);}@Overridepublic void setBeanName(String name) {System.out.println("这个Bean的名字是:"+name);}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("InitializingBean's afterPropertiesSet执行。");}
}

在这里插入图片描述

3、点位3

实现DisposableBean接口

public class User implements BeanNameAware, BeanClassLoaderAware, BeanFactoryAware, InitializingBean,DisposableBean {public void setName(String name) {System.out.println("第二步:给对象的属性赋值。");}public User() {System.out.println("第一步:无参数构造方法执行。");}public void initBean(){System.out.println("第四步:初始化Bean。");}public void destroyBean(){System.out.println("第七步:销毁Bean。");}@Overridepublic void setBeanClassLoader(ClassLoader classLoader) {System.out.println("Bean这个类的加载器:"+classLoader);}@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {System.out.println("生产这个Bean的工厂对象是:"+beanFactory);}@Overridepublic void setBeanName(String name) {System.out.println("这个Bean的名字是:"+name);}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("InitializingBean's afterPropertiesSet执行。");}@Overridepublic void destroy() throws Exception {System.out.println("DisposableBean's destroy执行");}
}

在这里插入图片描述

四、Bean的作用域

  • spring容器只对singleton的Bean进行完整的生命周期管理
  • 如果是prototype作用域,Spring容器只负责将该Bean初始化完毕,等客户端一旦获取到该Bean之后,Spring容器就不再管理该对象的生命周期了(生出来就不管了)
    测试:
    在配置文件中加入
    scope=“prototype”
    在这里插入图片描述
    客户端获取之后,就不再继续管之后的生命周期了


http://www.ppmy.cn/news/6188.html

相关文章

Python基础(十八):学员管理系统应用

文章目录 学员管理系统应用 一、系统简介 二、步骤分析 三、需求实现 1、显示功能界面 2、用户输入序号&#xff0c;选择功能 3、根据用户选择&#xff0c;执行不同的功能 4、定义不同功能的函数 学员管理系统应用 一、系统简介 需求&#xff1a;进入系统显示系统功能…

jar包冲突总结

目录1. jar包冲突体现2. jar包冲突分类3. 解决1. jar包冲突体现 构建时没问题, 但运行时会报错. jar冲突一般会报如下异常: java.lang.NoClassDefFoundErrorjava.lang.NoSuchMethodExceptionjava.lang.NoSuchFieldException 总结就是找不到预期的Class/Method/Field 但如果构建…

蓝桥杯,我劝你不要参加的8个完美理由

蓝桥杯&#xff0c;是一个全国高校的IT技术比拼&#xff0c;如果你参加了&#xff0c;可能不止是刷题数量的剧增&#xff0c;还有你的软件人生 我劝你不要参加&#xff0c;因为如果你参加了&#xff0c;可能会有以下烦恼&#xff1a; 目录 1、会让你变得上进 2、会提前感受码…

Android 12.0 系统多个播放器app时,设置默认播放器

目录 1.概述 2.系统多个播放器app时,设置默认播放器的核心类

亚马逊首次亮相中性原子量子计算机Aquila

Aquila处理器内饰&#xff08;图片来源&#xff1a;网络&#xff09; 亚马逊网络服务&#xff08;AWS&#xff09;将在其名为Amazon Braket的特殊云服务器中托管量子计算机Aquila。这是量子计算第一次可以直接从AWS云端访问中性原子量子处理器。 而提供这台量子计算机的公司是Q…

win环境mysql版本升级到5.7过程

win环境mysql版本升级到5.7过程&#xff0c;我win电脑里mysql版本是5.0&#xff0c;版本太老了&#xff0c;也不支持和nacos集成&#xff08;nacos至少需要5.6版本的mysql&#xff09;&#xff0c;思来想去还是要升级一下自己电脑的mysql版本&#xff0c;保守点升级到5.7吧&…

Elasticsearch倒排索引详解

这篇博客的主要目的是介绍一下ES当中的倒排索引&#xff0c;参考&#xff1a;https://blog.csdn.net/qq_21312297/article/details/102496833 https://zhuanlan.zhihu.com/p/68092794 https://baijiahao.baidu.com/s?id1661292466150156938&wfrspider&forpc https:…

【20天快速掌握Python】day12-文件操作

1.文件的打开与关闭 想一想&#xff1a; 如果想用word编写一份简历&#xff0c;应该有哪些流程呢&#xff1f; 打开word软件&#xff0c;新建一个word文件 写入个人简历信息 保存文件 关闭word软件 同样&#xff0c;在操作文件的整体过程与使用word编写一份简历的过程是很相…