spring源码之bean的生命周期理解

在实例化bean之前会进行一系列的验证操作,大致流程如下。

  1. 容器启动
  2. 完成扫描
  3. 合格的类,生成beanDefinition放入beanDefinitionMap中
  4. 遍历循环beanDefinitionMap
  5. 解析验证
    a. 是否单例
    b. 是否抽象
    c. 是否factoryBean(会走其他逻辑)
    d. 是否已经创建
    e. 是否懒加载
    f. 等等
  6. 获取类class对象(在这一步处理之前,类的对象还未存入永久代或者元空间中,还只是字节码文件并没有真正被JVM读取,这一步处理之后,才算是获取了类的对象)
  7. 推断构造方法(推断该Bean的实例化创建方式,一个bean实例化的方式有多种,比如说静态工厂方法、实例工厂方法或者通过构造方法反射实例化对象),spring会在这一步选择一个合理的构造方法。
  8. 反射执行实例化对象(到这一步,单单只是对象被实例化出来了,里面的属性还未被填充)

  1. 如果当前这个对象有循环依赖,那么这里会提前构造出一个ObjectFactory对象工厂的对象,然后缓存起来
  2. 缓存依赖注入的对象,如果当前类有Autowired属性填充需要注入的话,这里就会把Autowired修饰的属性缓存起来,等到执行依赖注入的时候,再来处理这个属性。
  3. 判断是否需要完成属性注入(这里有一个程序员可扩展方法,可以指定忽略某个对象的注入)
  4. 完成属性注入
  5. 执行部分aware的回调(四个aware)
  6. 之前其他aware的回调,还会执行生命周期的回调(被添加@PostConstruct注解的方法)
  7. 执行生命周期的回调,(接口版afterPropertiesSet和XML版)
  8. 如果具备aop,在这一步完成代理
  9. 放入单例池中

如果简单来说,bean的生命周期就是不断的调用各种BeanPostProcessor,来实现bean的各种内容,比如前面讲过的AutowiredAnnotationBeanPostProcessor会处理@Autowired注解的属性。
那么16步中的aop就是对生命周期的一种扩展,原本是没有这个代理的,后来扩展了BeanPostProcessor的实现类,让bean在生命周期中执行了扩展方法,才实现了aop的动态代理。

下一章我们来模拟扩展aop

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木小同

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值