当前位置: 首页 > news >正文

Spring中bean的生命周期(通俗易懂)

具体流程

  bean的生命周期分4个阶段:
  1.实例化
  2.属性赋值
  3.初始化
  4.销毁

  实例化就是在内存中new()出一个对象,属性赋值就是给那些被@Autowired修饰的属性注入对象,销毁是在Spring容器关闭时触发,初始化的步骤比较多:

  1.是否实现Aware的相关接口,调用重载方法
  (BeanNameAware#setBeanName,
  BeanClassLoaderAware#setBeanClassLoader,
  BeanFactoryAware#setBeanFactory,
  ApplicationContextAware#setApplicationContext)

  2.是否有bean实现BeanPostProcessor接口,调用实现的postProcessBeforeInitialization方法(实现类加载时不调用自身实现的方法,调用其他实现类的)

  3.是否实现InitializingBean接口,调用重载方法afterPropertiesSet方法

  4.是否指定@Bean的initMethod属性,调用指定的方法(定义在bean对应的类里,不是配置类里)

  5.是否有bean实现BeanPostProcessor接口,调用实现的postProcessAfterInitialization方法(和第2点同理)


  话不多说,下面用代码来给出示例。


代码示例

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;public class A implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean {public A() {System.out.println("a的构造函数");}@Overridepublic void setBeanName(String s) {System.out.println("初始化-setBeanName");}@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {System.out.println("初始化-setBeanFactory");}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {System.out.println("初始化-setApplicationContext");}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("初始化-afterPropertiesSet");}public void init() {System.out.println("初始化-init");}}
import org.springframework.context.annotation.Bean;public class MyConfiguration  {@Bean(initMethod = "init")public A a() {return new A();}}
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Import;@Import(MyConfiguration.class)
public class BootStrap {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(BootStrap.class);A bean = context.getBean(A.class);}}

  运行启动类后,控制台打印:

在这里插入图片描述

  这里单独再说下BeanPostProcessor,A类去实现它:

public class A implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean, BeanPostProcessor{//...//其余的方法不动,就添加下面2个方法public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println(beanName + ":初始化-beforeInitialization");return bean;}public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println(beanName + ":初始化-afterInitialization");return bean;}}

  再次运行启动类,控制台和之前的一样(A这个bean的初始化,没有调用实现的那2个方法):

在这里插入图片描述

  A类还原,不实现BeanPostProcessor;MyConfiguration类实现该接口:

import org.springframework.context.annotation.Bean;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;public class MyConfiguration implements BeanPostProcessor {@Bean(initMethod = "init")public A a() {return new A();}public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println(beanName + ":初始化-beforeInitialization");return bean;}public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println(beanName + ":初始化-afterInitialization");return bean;}}

  再次运行启动类,这时想要的效果有了:

在这里插入图片描述

  所以bean初始化中,不会调用自身实现BeanPostProcessor接口的那2个方法,调用其他实现BeanPostProcessor接口的bean的。

http://www.lryc.cn/news/14212.html

相关文章:

  • 雷达编程实战之恒虚警率(CFAR)检测
  • Github隐藏功能:显示自己的README,Github 个人首页的 README,这样玩儿
  • @JsonSerialize—优雅地封装返回值
  • 【Python网络编程】利用Python进行TCP、UDP套接字编程
  • fuzz测试之libfuzzer使用小结
  • 电子标签拣货系统——外接供电版
  • 为什么启动一个线程不用run()方法,而是用start()方法
  • Java File相关操作
  • LabVIEW利用矢量量化直方图开发人脸识别
  • RK3568工业开发板工控板说明
  • JavaScript Web API 来构建你不了解的网站
  • KeePass敏感信息明文传输漏洞复现 (CVE-2023-24055)
  • Android 11 中的权限更新
  • october-cms
  • 抖音怎样报白?报白需要审核哪些资料呢
  • Spring中的AOP
  • 文件系统与动静态库的基本了解
  • netty——IO、NIO、AIO进化之路
  • AI稳定生成图工业链路打造
  • 20230220华南金牌主板u盘启动
  • 测试团队都在用哪些不错的测试用例管理平台?盘点6大主流测试管理系统
  • linux 系统编程之线程
  • 从0开始学python -35
  • 1.14 golang中的结构体
  • 原创不易,坚持更难
  • 计算机网络 | 谈谈TCP的流量控制与拥塞控制
  • Flask入门(7):内置装饰器(钩子函数)
  • Java8新特性
  • 哈希表题目:设计哈希集合
  • java static关键字 万字详解