Spring之Bean生命周期源码解析上

105 阅读2分钟

Beand的生命周期指的是在Spring中,一个bean是如何生成,如何销毁的。

Bean的生成过程

  1. 生成BeanDefinition

  2. 合并BeanDefinition

  3. 加载类

  4. 实例化前

  5. 实例化

    • Supplier创建对象
    • 工厂方法创建对象
    • 推断构造方法
  6. 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());  
  }  
 }  
}

  1. 实例化后

在处理完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;  
 }  
}
  1. 自动注入

这里的自动注入指的是Spring的自动注入,相关链接

  1. 处理属性

这个过程会处理@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();
}
}


}

}


}

}

  1. 执行Aware回调方法

完成了属性赋值之后会执行一些回调,包括:

  1. 回传BeanName给bean对象——BeanNameAware
  2. 回传classloader--(类加载器)给bean对象——BeanClassLoaderAware
  3. 回传beanFactory给bean对象——BeanFactoryAware
  1. 初始化前

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;

}
}
}
  1. 初始化
  • 查看当前对象是否实现了InitialingBean接口,如果实现了,就调用其afterPropertiesSet()----属性赋值之后的方法。
  • 执行BeanDefinition中指定的初始化方法
  1. 初始化后

这是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的一个扩展点。