ARTICLE · 1161333
@Autowired 注入源码:字段怎么被反射 set
@Autowired 注入源码:字段怎么被反射 set
@Autowired 注入源码:字段怎么被反射 set
面试官问@Autowired怎么把Bean塞进字段里,我当场卡壳。原来底层就靠两行代码:先干掉private限制,再调用field.set()直接反射写入。
具体是谁在干活?AutowiredAnnotationBeanPostProcessor。它提前扫好注解、缓存元数据,等populateBean阶段再逐个注入。多个同类型候选时,裁决顺序是固定的:先看@Primary,再看名字匹配和@Qualifier,接着是@Priority,最后才兜底。规则全平就会爆出NoUniqueBeanDefinitionException。
构造器注入走的是另一条路。它在createBeanInstance阶段就解析依赖,对象一造出来就是完整的。字段注入却要先造空壳,等populateBean才反射塞值,中间存在一段依赖为null的窗口期。
所以官方推荐构造器注入,真不是风格偏好。字段注入连final都不能用,单测还得硬启容器。而构造器注入能保证对象一次成型,失败更早报错更准。至于@Resource,它默认走的是resolveBeanByName,找不到才回退按类型。
原文@Autowired 注入源码:字段怎么被反射 set 进去的
作者提示: 个人观点,仅供参考
广东,2小时前,