java面试复习(spring相关系列)
spring中bean的生命周期
Bean的定义与实例化:Spring通过xml或者@Compent,@Service等注解进行bean的定义;Spring 容器根据定义创建 Bean 实例。对于无参构造函数的 Bean,Spring 通过反射直接调用构造函数进行实例化。如果 Bean 有多个构造函数,Spring 会选择参数匹配度最高的构造函数
源码关联:AbstractAutowireCapableBeanFactory#createBeanInstance
属性注入:Bean 实例化后,Spring 容器会对 Bean 的属性进行依赖注入。这可以通过 XML 配置的<property>
标签或注解(如@Autowired
、@Resource
)来实现。
源码关联:AbstractAutowireCapableBeanFactory#populateBean
初始化前处理:在属性注入完成后,Spring 会调用实现了BeanNameAware
、BeanClassLoaderAware
和BeanFactoryAware
接口的方法。
BeanNameAware:setBeanName(String name)
方法被调用,Bean 可以获取自身在 Spring 容器中的名称
BeanClassLoaderAware:setBeanClassLoader(ClassLoader classLoader)
方法被调用,Bean 可以获取加载自身的类加载器。
BeanFactoryAware:setBeanFactory(BeanFactory beanFactory)
方法被调用,Bean 可以获取所属的 Spring BeanFactory。
源码关联:AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization
初始化:自定义初始化方法:可以通过init - method
属性在 XML 配置中指定初始化方法,或使用@PostConstruct
注解在方法上定义初始化逻辑。InitializingBean 接口:如果 Bean 实现了InitializingBean
接口,其afterPropertiesSet()
方法会在属性注入后被调用,用于执行初始化操作。
源码关联:AbstractAutowireCapableBeanFactory#invokeInitMethods
初始化后处理:在Bean初始化后进行增强处理(如生成代理对象),典型应用spring Aop代理
源码关联:AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization
使用阶段:Bean已完全初始化,可被应用程序获取并使用。
销毁阶段:释放Bean占用的资源(如关闭数据库连接、释放缓存)
调用顺序:
- 执行
@PreDestroy
标注的方法。 - 调用
DisposableBean#destroy()
接口方法。 - 调用XML配置或
@Bean
注解中指定的destroy-method
方法。
spring在bean对象初始化过程中提供了很多扩展点