Spring之Bean生命周期源码解析(二)

本文详细探讨了Spring Bean的生命周期,包括实例化前的扩展点、Supplier与工厂方法创建对象、构造方法的选择、BeanDefinition的后置处理、自动注入和Aware回调接口,以及初始化前后的各个阶段。通过对BeanPostProcessor的理解,揭示了Spring如何管理Bean的完整生命周期。
摘要由CSDN通过智能技术生成

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();
  }
}

方式二

  &
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值