spring生命周期
版本1
步骤:
实例化
- 初始化Bean, 就是new。
推断构造方法,默认使用无参构造;如果一个类有多个构造方法,首先会判断是否有@Autowired指定构造方法,再看是否有无参构造方法。如果都没有就会报错 No default constructor found
属性赋值
通过Setter方法或字段注入(如@Autowired)为Bean的属性赋值,默认无参构造得到的对象是没有值的
初始化
Aware接口回调
获取容器资源,若Bean实现了BeanNameAware、BeanFactoryAware、ApplicationContextAware等接口,会在此阶段调用对应的setXXX()方法注入资源。??和属性赋值中的setter()有什么区别呢【通过实现ApplicationContextAware,获取context】
BeanPostProcessor前置处理
调用postProcessBeforeInitialization()方法【例如AOP代理在此生成】。
InitializingBean与init-method
若实现了InitializingBean接口,会调用afterPropertiesSet()方法;若配置了init-method,则执行自定义初始化逻辑。
afterPropertiesSet():在 Bean 的属性注入完成后,执行自定义的初始化逻辑。它是 Spring 提供的标准初始化回调机制之一,用于确保 Bean 在完全装配(依赖注入完成)后,可以执行必要的初始化操作(例如数据校验、资源连接、启动后台线程等;URE项目中加载yml中自定义的属性文件,然后加载到spring容器中)如;
为什么需要它?
保证初始化顺序--回调:确保依赖注入完成后再执行初始化逻辑,避免空指针异常。
统一生命周期管理:通过接口明确标识初始化方法,Spring 容器可自动触发,无需手动配置。
与框架深度集成:某些 Spring 内部组件(如 AbstractMessageListenerContainer)依赖此接口实现资源启动。
BeanPostProcessor后置处理
调用postProcessAfterInitialization()方法。
销毁
容器关闭时,若Bean实现了DisposableBean接口,调用destroy()方法;若配置了destroy-method,执行自定义销毁逻辑
高频扩展点与关键接口
在生命周期中,Spring提供了丰富的扩展点,需分类说明:
影响多个Bean的接口
BeanPostProcessor:在初始化前后拦截所有Bean,如AOP代理、事务管理等12。
InstantiationAwareBeanPostProcessor:在实例化前后介入,可阻断属性注入或替换Bean实例(如AOP动态代理)
仅影响当前Bean的接口
Aware接口:分两组执行顺序:
Group1:BeanNameAware、BeanClassLoaderAware、BeanFactoryAware。
Group2:EnvironmentAware、ApplicationContextAware(通过BeanPostProcessor实现)
生命周期接口:InitializingBean(初始化)、DisposableBean(销毁)
总结
InitializingBean 接口的 afterPropertiesSet() 方法,是 Spring 为 Bean 提供的一个初始化回调接口。它的核心作用是在 Bean 的属性依赖注入完成后,执行自定义的初始化逻辑,例如校验必要参数、建立外部连接等。与 init-method 相比,它的调用更早,但侵入性更强。实际开发中,若需要与 Spring 解耦,可通过 @PostConstruct 或 XML 配置 init-method 替代。但某些框架内部组件(如消息监听容器)仍会使用此接口确保初始化顺序。
- 配置Bean, IOC。 填充属性/对象赋值,默认无参构造得到的对象是没有值的。
- BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,此处传递的是Spring配置文件中Bean的ID
- BeanFactoryAware接口,会调用它实现的setBeanFactory(),传递的是Spring工厂本身(可以用这个方法获取到其他Bean)
- ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文。该方式同样可以实现步骤4,但比4更好,以为ApplicationContext是BeanFactory的子接口,有更多的实现方法。
- BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用After方法,也可用于内存或缓存技术
- 如果这个Bean实现了InitiallizingBean接口,spring将会调用afterPropertitesSet();类似的,如果在Spring配置文件中配置了init-method属性,也会自动调用其配置的初始化方法
- 如果这个Bean关联了BeanPostProcessor接口,将会调用postAfterInitialization(Object obj, String s)方法
注意:以上工作完成以后就可以用这个Bean了,那这个Bean是一个single的,所以一般情况下我们调用同一个ID的Bean会是在内容地址相同的实例
9. 销毁阶段:DisposableBean接口,会调用其实现的destroy方法;如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法
功能点:释放与Bean实例相关联的资源(如内存、数据库连接等)
注意: 这里描述的是应用Spring上下文Bean的生命周期(ApplicationContext),如果应用Spring的工厂也就是BeanFactory的话去掉第5步就Ok了
一个类中调用顺序: 静态方法>构造函数 > @Autowired > @PostConstruct
@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行
@PostConstruct 方法的执行时机是在依赖注入完成后、属性设置完成后、在调用其他初始化回调方法之前。它对于执行一些需要在对象创建后立即执行的逻辑非常有用,例如初始化成员变量、建立数据库连接、加载配置文件等。
参考链接:
https://www.cnblogs.com/twoheads/p/10215041.html
https://blog.csdn.net/qq_52897007/article/details/140507980?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-140507980-blog-118500805.235v43pc_blog_bottom_relevance_base5&spm=1001.2101.3001.4242.1&utm_relevant_index=3(包含不同步骤版本的解释,可以更好地理解,但是过于细致,初看者不适合)
https://cloud.tencent.com/developer/article/2432245(高阶)
版本2
步骤
- 实例化
两种方式:
1)通过反射去推断构造函数进行实例化
2)实例工厂/静态工厂 - 属性赋值
1)解析自动装配,byName/byType/constructor/Autowired
2)循环依赖 - 初始化
1)调用Aware接口
2)调用初始化生命周期回调(三种)
3)如果bean实现aop,去创建代理 - 销毁
TODO
刷源码加深理解,将对应的代码块补充到这里

浙公网安备 33010602011771号