ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Spring IoC 依赖查找

2021-10-14 11:02:55  阅读:144  来源: 互联网

标签:beanName String beanFactory Spring BeanFactory HierarchicalBeanFactory 查找 lbf Io


依赖查找

  • 什么是双亲委派机制?

    先找“老子”,再找“小子”。

双亲委派机制

HierarchicalBeanFactory

HierarchicalBeanFactory是层次性BeanFactory。
  • 查看HierarchicalBeanFactory继承树

在这里插入图片描述

  • 获取ConfigurableListableBeanFactory
ConfigurableListableBeanFactory beanFactory = applicationContext.getBeanFactory();
// 设置父BeanFactory
// 调用createParentBeanFactory()方法是加载另一个BeanFactory,
beanFactory.setParentBeanFactory(createParentBeanFactory());

 private static HierarchicalBeanFactory createParentBeanFactory() {
        DefaultListableBeanFactory defaultListableBeanFactory = new DefaultListableBeanFactory();
        XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(defaultListableBeanFactory);
        int i = reader.loadBeanDefinitions("classpath:/META-INF/dependency-looKup-context.xml");
        return defaultListableBeanFactory;
}
  • 查看当前BeanFactory是否含有Bean
//containsLocalBean(String)
public static void displayLocalBean(HierarchicalBeanFactory beanFactory, String beanName) {
        System.out.printf("当前 BeanFactory[%s] 是否包含bean[name : %s]   包含了:[%s] \n", beanFactory, beanName, beanFactory.containsLocalBean(beanName));
}

这些只能查看当前的BeanFactory,并不能查看前面设置的父BeanFactory,需要改进:

  • 子父全查
    private static boolean containsBean(HierarchicalBeanFactory beanFactory, String beanName) {
        BeanFactory parentBeanFactory = beanFactory.getParentBeanFactory();
        if (parentBeanFactory instanceof HierarchicalBeanFactory) {
            HierarchicalBeanFactory cast = (HierarchicalBeanFactory) parentBeanFactory;
            if (containsBean(cast, beanName)) {
                return true;
            }
        }
        return beanFactory.containsLocalBean(beanName);
    }

综上所述,这个双亲委派机制可以使用BeanFactoryUtils#beanNamesForTypeIncludingAncestors(包含祖先的类型的 bean 名称)获取到 “父子” BeanFactory中的Bean;

BeanFactoryUtils

	public static String[] beanNamesForTypeIncludingAncestors(ListableBeanFactory lbf, Class<?> type) {
		Assert.notNull(lbf, "ListableBeanFactory must not be null");
		String[] result = lbf.getBeanNamesForType(type);
		if (lbf instanceof HierarchicalBeanFactory) {
			HierarchicalBeanFactory hbf = (HierarchicalBeanFactory) lbf;
			if (hbf.getParentBeanFactory() instanceof ListableBeanFactory) {
				String[] parentResult = beanNamesForTypeIncludingAncestors(
						(ListableBeanFactory) hbf.getParentBeanFactory(), type);
				result = mergeNamesWithParent(result, parentResult, hbf);
			}
		}
		return result;
	}

标签:beanName,String,beanFactory,Spring,BeanFactory,HierarchicalBeanFactory,查找,lbf,Io
来源: https://blog.csdn.net/qq_43750771/article/details/120757780

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有