Spring-Beans的生命周期的介绍
目录
1、Spring核心组件
2、Bean组件
2.1、Bean的定义
2.2、Bean的生命周期
1、实例化
2、属性填充
3、初始化
4、销毁
2.3、Bean的执行时间
2.4、Bean的作用域
3、常见问题解决方案
4、与Java对象区别
前言
关于bean的生命周期,如下所示:
之前文章介绍Spring的核心模块,可参考:Spring的核心模块原理介绍_spring 原理-CSDN博客
1、Spring核心组件
spring的核心组件由容器层、测试层、数据链接层、web层、AOP、Aspects等组成。
而容器层里面有四个组件,分别是beans,context、core、expression language。
如下图所示、
2、Bean组件
对于spring-beans,由bean的定义,注入方式、生命周期和作用域四种组成。
2.1、Bean的定义
1.BeanDefinition(Bean定义抽象)
代码如下图所示:
public interface BeanDefinition {String getBeanClassName();String getScope();boolean isSingleton();boolean isLazyInit();// 其他元数据访问方法...
}
关于bean定义信息如下图所示:
2.2、Bean的生命周期
Spring Bean 的生命周期指的是一个 Bean 从创建到销毁的整个过程,可以按照container容器,bean,aware三个组件进行介绍。
如下图所示:
关于每个阶段需要执行的流程,如下图所示:
由上图可知,分为四个阶段
1、实例化
2、属性填充
如何解决三级缓存的问题,可参考:Spring容器三级缓存介绍_三级缓存spring-CSDN博客
关于三级缓存就发生在属性填充阶段。
3、初始化
分为aware回调函数和初始化回调。
1、aware回调。
2、初始化回调包括初始化前、初始化、初始化后阶段,分别由BeanPostProcessor类进行调用。
动态代理也发生在初始化阶段。
4、销毁
当使用完成后,会进行销毁阶段。
代码如下所示:
public class destroyBeanTest implements DisposableBean {@Overridepublic void destroy() throws Exception {}
}
关于整个bean的执行流程顺序的代码示例:
public class LifecycleBean implements BeanNameAware, InitializingBean, DisposableBean {private String name;// 1. 构造函数public LifecycleBean() {System.out.println("1. 构造函数执行");}// 2. 属性注入public void setName(String name) {System.out.println("2. 属性注入: " + name);this.name = name;}// 3. BeanNameAware@Overridepublic void setBeanName(String name) {System.out.println("3. BeanNameAware: " + name);}// 4. @PostConstruct@PostConstructpublic void postConstruct() {System.out.println("4. @PostConstruct方法");}// 5. InitializingBean@Overridepublic void afterPropertiesSet() {System.out.println("5. afterPropertiesSet()");}// 6. 自定义init方法public void customInit() {System.out.println("6. 自定义init-method");}// 7. @PreDestroy@PreDestroypublic void preDestroy() {System.out.println("7. @PreDestroy方法");}// 8. DisposableBean@Overridepublic void destroy() {System.out.println("8. destroy()");}// 9. 自定义destroy方法public void customDestroy() {System.out.println("9. 自定义destroy-method");}
}
2.3、Bean的执行时间
实例化、属性填充、初始化三个阶段在IOC容器加载的时候去执行的,销毁在spring容器关闭的时候,才会执行。
2.4、Bean的作用域
bean在被Spring容器装配时,作用域(Scope)分为singleton、prototype、request、session,其中request和session适用于WebApplicationContext环境。
1、singleton
单例模式,Spring的容器中只有一个实例,有Spring容器创建,创建时间点,分为启动创建和延迟加载,根据bean对象配置的属性lazy-init属性决定,默认为false,配置为true时,会在第一次调用时创建该对象。
2、prototype
非单例模式,每次从Spring容器中调用时,都返回一个新实例。创建bean对象的时间点为bean被调用时。所以都是lazy-init。
3、request
每次request请求都会创建一个新的bean。
4、session
同一个session共享一个bean。
3、常见问题解决方案
-
循环依赖
-
重构设计,避免循环依赖
-
使用@Lazy延迟加载一方
-
改用setter/field注入
-
-
Bean覆盖
-
使用@Primary指定主候选Bean
-
通过@Qualifier明确指定Bean
-
合理命名Bean(避免自动装配歧义)
-
-
生命周期异常
-
确保@PostConstruct方法轻量
-
避免在初始化阶段依赖未准备好的Bean
-
正确处理原型作用域Bean的资源释放
-
4、与Java对象区别
总结
Spring Bean 机制是 Spring 框架的基石,通过理解其工作原理,可以更好地利用 Spring 的强大功能,构建松耦合、易测试、可维护的应用程序。
总结
1、Spring官网阅读(十)Spring中Bean的生命周期(下)_applybeanpost-CSDN博客