Spring 执行顺序:@Autowired 和 @Value 注解

回目录

代码:https://gitee.com/free/boot-order/tree/master/src/main/java/com/github/abel533/autowired

结合 PostProcessor 时的执行顺序

  1. InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation - userExt
  2. SmartInstantiationAwareBeanPostProcessor#determineCandidateConstructors - userExt
  3. UserExt#constructor
  4. InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation - userExt
  5. InstantiationAwareBeanPostProcessor#postProcessProperties - userExt
  6. UserExt@Value("${autowired.testValue}")
  7. UserExt@Value("#{systemProperties['os.name']}")
  8. UserExt@Autowired
  9. BeanPostProcessor#postProcessBeforeInitialization - userExt
  10. BeanPostProcessor#postProcessAfterInitialization - userExt

第 0 步可以通过返回 bean 来替代默认创建实例的方法。

第 1 步可以返回一个可用的构造方法。

第 2 步为构造方法注入,执行的比字段和方法注入要早(理所当然)

第 3 步时实例已经创建,但是还未注入属性。

第 4 步时,示例中什么也没做,实际上在 AutowiredAnnotationBeanPostProcessor#postProcessProperties 方法中,对 @Autowired@Value 的字段或方法进行了注入。

第 5~7 步时,也就是 AutowiredAnnotationBeanPostProcessor 对方法和字段进行注入。

第 8 步时,在执行实例的初始化方法前进行调用。后续会调用 bean 的初始化方法。

第 9 步时,已经执行完成了初始化方法,此时的 bean 已经是最终的结果了,但是你仍然可以在此对 bean 进行处理,例如再包装一层代理。

结合 Bean 的生命周期时的顺序

  1. UserExt#constructor
    构造方法
  2. UserExt@Value("${autowired.testValue}")
    注入
  3. UserExt@Value("#{systemProperties['os.name']}")
    注入
  4. @PostConstruct
    从这儿往下都是初始化和销毁方法
  5. InitializingBean#afterPropertiesSet
  6. @PostConstruct
  7. InitializingBean#afterPropertiesSet
  8. @Bean(initMethod)
  9. SmartLifecycle#isRunning
  10. SmartLifecycle#start
  11. SmartLifecycle#isRunning
  12. SmartLifecycle#start
  13. SmartLifecycle#isRunning
  14. SmartLifecycle#stop
  15. SmartLifecycle#isRunning
  16. SmartLifecycle#stop
  17. @PreDestroy
  18. DisposableBean#destroy
  19. @Bean(destroyMethod)
  20. @PreDestroy
  21. DisposableBean#destroy

也就是说,在生命周期中,所有注入的数据都已经可以使用。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

isea533

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

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

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

打赏作者

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

抵扣说明:

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

余额充值