其实这两个的最大区别是,依赖注入的来源可以是非spring容器管理的对象
在refresh()启动容器的时候,会调用prepareBeanFactory()来初始化各种BeanFactory
在初始化过程过,会注册进去四个特殊的Bean,其不是由spring的IOC容器管理的(不会变为BeanDefinition),而是最终会put到一个名为resolvableDependencies的ConcurrentHashMap中作为缓存
上面写着 (and found for atuowiring) 意思是为了Autowired使用的,那么我们就看看autowired在哪使用它了
这一步是根据信息去IOC容器中找对应的Bean,并且注入到目标字段中 这个是重点在findAutowireCandidates()这个方法中
就是根据findAutowiringMetadata()方法中找到的被@Autowired修饰的字段或方法,在IOC容器中寻找对应的Bean
但是在这一步之前,它会先遍历resolvableDependencies这个map,判断被@Autowired修饰的字段或方法里有没有在这个map中的,如果有就不去IOC容器中找(容器里也没有,根本找不到),直接从map中获取其对象.
网友评论