Spring7指南(三)之Bean的生命周期
项目工程完整地址:https://github.com/YiyiCoding/Spring7Guides
Bean的单例说明
多例Bean( @Scope(“prototype”) )每次都由IOC容器New一个新对象,此处之外跟容器没有太多的联系性
单例才具有生命周期的概念
单例有懒加载的概念:需要时才由IOC容器创建Bean
只要在类上面或@Bean 上注解
@Lazy即可
Bean的生命周期
- 实例化(Instantiation)→
- 属性填充(Populate)→
- 前置初始化(BeanPostProcessor.postProcessBeforeInitialization)→
- 初始化(Initialization)→
- 后置初始化(BeanPostProcessor.postProcessAfterInitialization)→
- 就绪(Ready):【在容器中可用】 →
- 销毁前处理(DestructionAwareBeanPostProcessor)→
- 销毁(Destruction)
【今天Spring7包含的知识点】:
@Lazy
Bean的生命周期
构造函数注入
publicUserService2(OrderServiceorderService){this.orderService=orderService;}需适配 Jakarta EE 9+
implementation("jakarta.annotation:jakarta.annotation-api:3.0.0")@PostConstruct
@PreDestroy
InitializingBean
DisposableBean
代码开始
- 新增依赖,Spring7 要求 Jakarta EE 9+
implementation("jakarta.annotation:jakarta.annotation-api:3.0.0")- UserService2,采用构造函数注入
@ServicepublicclassUserService2{privatefinalOrderServiceorderService;publicUserService2(OrderServiceorderService){this.orderService=orderService;}publicvoidtest(){System.out.println(orderService.demo());}}Bean的生命周期代码LifecycleBean:
packagecom.yiyi.coding.spring.ioc.bean;importjakarta.annotation.PostConstruct;importjakarta.annotation.PreDestroy;importorg.springframework.beans.factory.DisposableBean;importorg.springframework.beans.factory.InitializingBean;importorg.springframework.stereotype.Component;@ComponentpublicclassLifecycleBeanimplementsInitializingBean,DisposableBean{// 步骤1:实例化(无代码,容器自动执行)publicLifecycleBean(){System.out.println("【1. 实例化】创建Bean实例");}// 步骤2:属性填充(模拟注入,实际可通过配置注入)privateStringname;publicvoidsetName(Stringname){this.name=name;System.out.println("【2. 属性填充】设置属性name="+name);}// 步骤3:BeanPostProcessor前置处理(需自定义实现)// 步骤4:初始化@PostConstructpublicvoidpostConstruct(){System.out.println("【4.1 初始化】@PostConstruct");}@OverridepublicvoidafterPropertiesSet()throwsException{System.out.println("【4.2 初始化】InitializingBean#afterPropertiesSet");}publicvoidinitMethod(){System.out.println("【4.3 初始化】自定义init-method");}// 步骤5:BeanPostProcessor后置处理(需自定义实现)// 步骤6:就绪(可用)publicvoiddoBusiness(){System.out.println("【6. 就绪】Bean执行业务逻辑");}// 步骤7:销毁前处理(需自定义DestructionAwareBeanPostProcessor)// 步骤8:销毁@PreDestroypublicvoidpreDestroy(){System.out.println("【8.1 销毁】@PreDestroy");}@Overridepublicvoiddestroy(){System.out.println("【8.2 销毁】DisposableBean#destroy");}publicvoiddestroyMethod(){System.out.println("【8.3 销毁】自定义destroy-method");}publicStringgetName(){returnname;}}运行main函数的测试情况:LifecycleBean 中的某些方法未完全执行,有些需进行配置,如initMethod()等,本次略过。
packagecom.yiyi.coding.spring.ioc;// 测试类importcom.yiyi.coding.spring.ioc.bean.LifecycleBean;importorg.springframework.context.annotation.AnnotationConfigApplicationContext;importorg.springframework.context.annotation.ComponentScan;@ComponentScan("com.yiyi.coding.spring.ioc")publicclassLifecycleTest{staticvoidmain(){// 启动容器AnnotationConfigApplicationContextcontext=newAnnotationConfigApplicationContext(LifecycleTest.class);LifecycleBeanbean=context.getBean(LifecycleBean.class);bean.setName("test");// 手动触发属性填充(模拟容器注入)bean.doBusiness();// 关闭容器(触发销毁)context.close();}}以下生命周期的钩子已经足够使用。
【1. 实例化】创建Bean实例 【4.1 初始化】@PostConstruct 【4.2 初始化】InitializingBean#afterPropertiesSet 【2. 属性填充】设置属性name=test 【6. 就绪】Bean执行业务逻辑 【8.1 销毁】@PreDestroy 【8.2 销毁】DisposableBean#destroys