Spring IoC 依赖查找

  • 什么是双亲委派机制?

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

双亲委派机制

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;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值