四、Autowired分析总结先根据类型查找bean;如果没有找到则报错(默认情况下@Autowired是一定需要注入一个bean的);如果查找到一个则用找到的这一个完成注入;如果查找到多个,先把这个多个放到map当中,继而根据属性的名字从map当中去获取;能获取到则使用获取的这个;如果map当中通过名字还是无法获取则报错;
@Autowired不会改变bean的注入模型(默认情况下bean的注入模型还是0);@Autowired算是一种半自动注入;因为他只需要程序员告诉spring需要注入的属性或者方法,而不需要程序员告诉spring需要注入的属性或者方法他的值到底是哪个bean;@Autowired会根据自己的规则去查找这个bean,所以只能算作半自动注入;
五、Resource注解注入源码分析通过
CommonAnnotationBeanPostProcessor这个类的postProcessorProperties方
法来完成对@Resource注解的解析和处理

文章插图
后续的流程和Autowired差不多,就是扫描出来类所有加了Resource注解的属性,封装成对应的
InjectionMetadata.InjectedElement

文章插图

文章插图
在封装成ResourceElement时会读取注解中的值进行参数的赋值

文章插图
在调用ResourceElement的inject方法进行属性注入,但我们发现ResourceElement没有inject方法,我们就可以猜想出,这个方法肯定继承至父类

文章插图
我们最终在
InjectionMetadata.InjectedElement中找到了inject方法

文章插图
在调用子类ResourceElement的getResourceToInject方法

文章插图

文章插图
判断Resource是否自定义了名字,如果自定义了,则不会走类型查询并注入,而是会走else因为自定义了名字说明我们想根据名字注入对象;
如果没有自定义会先根据名字判断是否在单例池中存在或者在beanDefinitionMap中存在,存在则通过名字获取,没有则在通过类型去获取,获取到一个则进行注入,没有获取到或者获取到多个则抛异常;

文章插图

文章插图
六、Resource分析总结
@Resource在没有配置name的情况下首先根据名字查找;
如果名字能查找到则返回这个查找到的(spring容器的原则是name唯一的,所以不存在通过名字能查找到多个的情况);
如果通过名字查找不到(需要注意的是这里的前提是没有配置name的情况,spring觉得名字无所谓);因为对名字无要求,所以会再根据类型查找;那么走的就是@Autowired这一套;
如果配置了名字,spring觉得对名字有严格要求,所以只能根据你配置的名字查找;如果查找不到则报错,找到了则用;
推荐阅读
- 早会分享小故事及感悟简短关于心态的小故事?早会分享小故事及感悟PPT
- 明朝死的最惨的功臣?明朝功臣下场
- 明朝朱棣身边的和尚?朱棣身边的僧人_3
- 撒娇的话大全?撒娇的话怎么说
- 易经好听的女孩名字大全?姓易取什么名字好听女生
- 明代江南的四大才子?明朝三大才子和江南四大才子
- 宫颈糜烂烤电管用吗
- 做乳腺保养的好处
- 乳腺术后吃什么最好
- 产后24天恶露还是血
