Spring 面试题, 说下 Spring Bean 的生命周期?
Spring 面试题, 说下 Spring Bean 的生命周期?
QA
Step 1
Q:: Spring Bean 的生命周期是什么?
A:: Spring Bean 的生命周期包括几个主要阶段:
1. **实例化 (Instantiation)
:Spring 容器使用反射机制创建 Bean 实例。
2. **属性赋值 (Populate Properties)
:Spring 容器根据配置(XML 或注解)为 Bean 的属性进行赋值。
3. **调用 BeanNameAware 接口的 setBeanName 方法**:如果 Bean 实现了 BeanNameAware 接口,则调用它的 setBeanName()
方法传递 Bean 的名称。
4. **调用 BeanFactoryAware 接口的 setBeanFactory 方法**:如果 Bean 实现了 BeanFactoryAware 接口,则调用它的 setBeanFactory()
方法,传递当前 BeanFactory 实例。
5. **调用 ApplicationContextAware 接口的 setApplicationContext 方法**:如果 Bean 实现了 ApplicationContextAware 接口,则调用它的 setApplicationContext()
方法,传递当前 ApplicationContext 实例。
6. **调用 BeanPostProcessor 接口的 postProcessBeforeInitialization 方法**:如果存在 BeanPostProcessor,则在 Bean 初始化之前调用 postProcessBeforeInitialization()
方法。
7. **调用初始化方法**:如果 Bean 配置了 init-method 或实现了 InitializingBean 接口,Spring 将调用其 afterPropertiesSet()
方法或配置的初始化方法。
8. **调用 BeanPostProcessor 接口的 postProcessAfterInitialization 方法**:在 Bean 完成初始化后,调用 postProcessAfterInitialization()
方法。
9.
Bean 准备就绪:此时 Bean 已经准备好,可以被客户端使用。
10. **调用销毁方法**:当容器关闭时,调用实现了 DisposableBean 接口的 destroy() 方法,或者执行在配置中指定的 destroy-
method 方法。
Step 2
Q:: 什么是 BeanPostProcessor?如何使用它?
A:: BeanPostProcessor 是 Spring 提供的一种扩展接口,它允许开发者在 Spring 容器对 Bean 进行初始化的前后,添加一些自定义逻辑。BeanPostProcessor 的主要方法有两个:postProcessBeforeInitialization 和 postProcessAfterInitialization,分别在初始化前后执行。通常,BeanPostProcessor 可以用于修改 Bean 的属性、包装 Bean 或者添加额外的代理逻辑。
示例:你可以实现 BeanPostProcessor 接口来自定义一个处理器:
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
// 在 Bean 初始化之前处理
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
// 在 Bean 初始化之后处理
return bean;
}
}
你可以在 Spring 配置文件中注册该 BeanPostProcessor:
<bean class="com.example.MyBeanPostProcessor" />
Step 3
Q:: Spring 如何管理 Bean 的依赖注入?
A:: Spring 通过依赖注入 (DI)
来管理 Bean 之间的依赖关系。依赖注入主要有两种方式:
1.
构造器注入:在 Bean 定义时,通过构造函数传递依赖关系。
2.
Setter 方法注入:通过 Setter 方法注入依赖属性。
Spring 支持注解方式和 XML 配置方式的依赖注入。常见的注解有 @Autowired、@Inject、@
Resource,分别用于自动注入依赖 Bean。