1. Spring Bean 的生命周期是怎样的?
Spring Bean 的生命周期涉及多个步骤,从实例化到销毁。在 Spring 容器中,Bean 的生命周期由 Spring IoC 容器管理。
以下是 Bean 生命周期的关键步骤:
销毁(Destruction)
(1)DisposableBean.destroy():
实现该接口的 Bean 会调用 destroy() 方法。
(2)自定义销毁方法(destroy-method):
通过 XML 的 destroy-method 或 @Bean(destroyMethod="...") 指定的方法。
容器关闭时触发销毁(仅单例 Bean,原型 Bean 需手动管理)。
使用(Ready)
Bean 完全初始化,可被应用程序使用。
初始化(Initialization)
(1)Aware 接口回调(按顺序):
ApplicationContextAware → setApplicationContext()
BeanFactoryAware → setBeanFactory()
BeanNameAware → setBeanName()
(2)BeanPostProcessor.postProcessBeforeInitialization():
初始化前处理(例如 @PostConstruct 注解的处理逻辑)。
(3)InitializingBean.afterPropertiesSet():
属性注入完成后执行自定义初始化逻辑。
(4)自定义初始化方法(init-method):
通过 XML 的 init-method 或 @Bean(initMethod="...") 指定的方法。
(5)BeanPostProcessor.postProcessAfterInitialization():
初始化后处理(例如生成 AOP 代理对象)。
属性赋值(Populate properties)
注入 Bean 的依赖(通过 @Autowired、setter 或 XML 配置)。
实例化(Instantiation)
容器通过构造函数或工厂方法创建 Bean 的实例(对象)。
注:Spring 容器在启动时默认会初始化单例 Bean,但可以通过设置懒加载(lazy-init)来延迟初始化。对于原型(prototype)Bean,容器不会管理其完整生命周期,初始化后不会调用销毁方法。
Spring Bean 的生命周期通过 容器回调、接口实现、注解驱动 的方式提供了高度扩展性,开发者可在关键节点插入自定义逻辑,但需注意不同作用域 Bean 的生命周期差异。
2. Spring AOP 的实现原理是什么?动态代理和 CGLIB 代理的区别?
Spring AOP 的实现原理是基于动态代理的。在运行时,Spring AOP 会为目标对象创建代理对象,代理对象会拦截对目标方法的调用,并在方法执行前后插入切面逻辑。
Spring AOP 有两种动态代理方式:
- JDK 动态代理:基于接口的代理。如果目标对象实现了至少一个接口,Spring 默认会使用 JDK 动态代理。
- CGLIB 代理:基于子类的代理。如果目标对象没有实现任何接口,Spring 会使用 CGLIB 来创建代理。
动态代理和 CGLIB 代理的区别:
| 特性 | JDK 动态代理 |
|---|


