Spring之Bean生命周期源码解析(二)
- 回顾
- 实例化前
- 实例化
- 推断构造方法
- BeanDefinition的后置处理
- 实例化后
- 自动注入
- 填充属性
- 执行Aware回调接口
- 初始化前
- 初始化
- 初始化后
- 总结BeanPostProcessor
回顾
Bean的生命周期流程图
包扫描流程图
实例化前
当前BeanDefinition对应的类被成功加载之后,就可以进行实例化对象了.
但是在Spring中,实例化对象前,Spring提供了一个扩展点,允许用户来控制是否在某个或者某些Bean实例化前做一些启动动作.
这个扩展点叫
InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation()
需要注意的是这里是有返回值的,如果实现了这个并且返回了一个对象,那么后续Spring的依赖注入也就不会进行了,会跳过一些步骤,直接进行初始化后这一步.
public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {
@Nullable
default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
return null;
}
...
}
实例化
在这一步就会根据BeanDefinition去创建一个对象了.
Supplier创建对象
首先判断BeanDefinition是否设置了Supplier,如果设置了就会调用Supplier#get()得到对象.
@Test
public void testSupplier() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
AbstractBeanDefinition bd = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
bd.setInstanceSupplier(UserService::new);
ctx.registerBeanDefinition("userService", bd);
UserService userService = ctx.getBean("userService", UserService.class);
userService.test();
}
工厂方法创建对象
如果没有设置Supplier,就会检查BeanDefinition是否设置了factoryMethod,也就是工厂方法,有两种方式可以设置factoryMethod
方法一
<bean id="userService" class="linc.cool.service.UserService" factory-method="createMethod" />
对应的类
public class UserService{
public void test() {
System.out.println(this.getClass().getName() + ".test()");
}
public static UserService createMethod() {
System.out.println("执行createUserService()");
return new UserService();
}
}
方式二
&