标签:ApplicationContext beanFactory registerResolvableDependency private 如何 resolvabl
//ERROR No qualifying bean of type 'org.springframework.context.ApplicationContext' available applicationContext.getBean(ApplicationContext.class); //SUCCESS @Component public class SimpleBean3 { @Autowired private ApplicationContext applicationContext; @Autowired private SimpleBean2 simpleBean2; }
ApplicationContext是Spring中的重要组件,它不是bean,因此无法通过getBean获取它,但是可以通过Autowired注入获得,其中必定有特殊的处理。
普通Bean的元数据存放在DefaultListableBeanFactory的beanDefinitionNames和beanDefinitionMap,普通Bean通过遵照Spring提供的机制自动注册添加,这是Spring提供的功能。
private volatile List<String> beanDefinitionNames = new ArrayList<>(256); private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
ApplicationContext和BeanFactory存储在DefaultListableBeanFactory的resolvableDependencies,它们需要手动注册添加,这是Spring的框架内部逻辑
private final Map<Class<?>, Object> resolvableDependencies = new ConcurrentHashMap<>(16);
在查找依赖时,会同时搜寻beanDefinitionNames和resolvableDependencies,因此ApplicationContext也能被查找到。
而getBean时只会查找上面的BeanDefinitionMap,因此找不到ApplicationContext。
注入流程
注册 ApplicationContext 为 resolvableDependencies
在 AbstractApplicationContext.prepareBeanFactory() 中, ApplicationContext 被注册到 resolvableDependencies 中。
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) { //...忽略部分代码 // BeanFactory interface not registered as resolvable type in a plain factory. // MessageSource registered (and found for autowiring) as a bean. beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory); beanFactory.registerResolvableDependency(ResourceLoader.class, this); beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this); beanFactory.registerResolvableDependency(ApplicationContext.class, this); //...忽略部分代码 }
生成Bean时查找依赖
REF
ApplicationContext是如何被注入的
https://www.jianshu.com/p/64a25883b836
@Autowired可以注入ApplicationContext
https://zhuanlan.zhihu.com/p/124249445
标签:ApplicationContext,beanFactory,registerResolvableDependency,private,如何,resolvabl 来源: https://www.cnblogs.com/emanlee/p/15759135.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。