Beand的生命周期指的是在Spring中,一个bean是如何生成,如何销毁的。
Bean的生成过程
-
生成BeanDefinition
-
合并BeanDefinition
-
加载类
-
实例化前
-
实例化
- Supplier创建对象
- 工厂方法创建对象
- 推断构造方法
-
BeanDefinition的后置处理器 Bean对象实例化出来之后,接下来会给bean属性进行赋值。但是Spring在给Bean属性进行赋值之前,会对此时的BeanDefinition进行加工。合并BeanDefinition——MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition()
@Component
public class ZhouyuMergedBeanDefinitionPostProcessor implements MergedBeanDefinitionPostProcessor {
@Override
public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {
if ("userService".equals(beanName)) {
beanDefinition.getPropertyValues().add("orderService", new OrderService());
}
}
}
- 实例化后
在处理完BeanDefinition之后,Spring又提供了一个扩展点,对bean实例化后进行扩展,InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation()
@Component
public class ZhouyuInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
if ("userService".equals(beanName)) {
UserService userService = (UserService) bean;
userService.test();
}
return true;
}
}
- 自动注入
这里的自动注入指的是Spring的自动注入,相关链接:
- 处理属性
这个过程会处理@Autowired,@Resource,@Value等注解,也是通过
**InstantiationAwareBeanPostProcessor.postProcessProperties()**扩展点来实现的,比如我们
甚至可以实现一个自己的自动注入功能,比如:
@component
public class RuozhuoInitiationAwareBeanPostProcessor implements InitiationAwareBeanPostProcessor{
@Override
public PropertyValues postProcessorProperties(PropertyValues pvs,Object bean,String BeanName) throws BeansException{
if("userService".equals(beanName)){
for(Field field:bean.getClass().getFilds()){
if(fields.isAnnotationPresent(RuozhuoInject.class)){
field.setAccessible(true);
try{
field.set(bean,"123");
}catch(IllegleAccessException e){
e.printStackTrace();
}
}
}
}
}
}
- 执行Aware回调方法
完成了属性赋值之后会执行一些回调,包括:
- 回传BeanName给bean对象——BeanNameAware
- 回传classloader--(类加载器)给bean对象——BeanClassLoaderAware
- 回传beanFactory给bean对象——BeanFactoryAware
- 初始化前
BeanPostProcessor.postProcessBeforInitialization(),比如:
@component
public class RuozhuoBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws
BeansException {
if ("userService".equals(beanName)) {
System.out.println("初始化前");
}
return bean;
}
}
}
- 初始化
- 查看当前对象是否实现了InitialingBean接口,如果实现了,就调用其afterPropertiesSet()----属性赋值之后的方法。
- 执行BeanDefinition中指定的初始化方法
- 初始化后
这是Bean创建生命周期的最后一步,也是Spring提供的扩展点: BeanPostProcessor.postProcessAfterInitialization(),比如:
@component
public class RuozhuoBeanPostProcessor implements BeanPostProcessor{
@Override//重写初始化后的方法
public Objdect postProcessAfterInitialization(Object bean,string beanName)
if("userService".equals(beanName)){
System.out.println("初始化后");
}
return bean;
}
}
可以在这个步骤中对bean进行最终的处理,Spring中的AOP就是基于初始化后实现的,初始化后返 回的对象才是最终的Bean对象。
Spring提供的扩展点: bean初始化前的时候,bean初始化后,实现BeanPostProcessor接口,重写初始化前和初始化后的方法。包括instantiationAwareBeanPostprocessor也是Spring的一个扩展点。