层次性依赖查找接口 - HierarchicalBeanFactory

  • 双亲 BeanFactory:getParentBeanFactory()

层次性查找

  • 根据 Bean 名称查找

    • 基于 containsLocalBean 方法实现
  • 根据 Bean 类型查找实例列表
    • 单一类型:BeanFactoryUtils#beanOfType
    • 集合类型:BeanFactoryUtils#beansOfTypeIncludingAncestors
  • 根据 Java 注解查找名称列表
    • BeanFactoryUtils#beanNamesForTypeIncludingAncestors

实体类Rumenz.java / SuperRumenz.java

package com.rumenz;
public class Rumenz extends SuperRumenz{private Integer id;private String name;@Overridepublic String toString() {return "Rumenz{" +"id=" + id +", name='" + name + '\'' +"} " + super.toString();}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}//SuperRumenz.javapackage com.rumenz;public class SuperRumenz {private String key;public String getKey() {return key;}public void setKey(String key) {this.key = key;}@Overridepublic String toString() {return "SuperRumenz{" +"key='" + key + '\'' +'}';}
}

**配置类Config.java / Config1.java **

package com.rumenz;
import org.springframework.context.annotation.Bean;public class Config {@Beanpublic SuperRumenz superRumenz(){SuperRumenz s=new SuperRumenz();s.setKey("超级管理员");return s;}
}// Config1.javapackage com.rumenz;
import org.springframework.context.annotation.Bean;public class Config1 {@Beanpublic static Rumenz rumenz(){Rumenz r = new Rumenz();r.setId(123);r.setName("入门小站");return r;}
}

案例DemoApplication.java

package com.rumenz;public class DemoApplication {public static void main(String[] args) {AnnotationConfigApplicationContext ac=new AnnotationConfigApplicationContext();ac.register(Config1.class);ac.refresh();ConfigurableListableBeanFactory beanFactory = ac.getBeanFactory();System.out.println("父容器"+beanFactory.getParentBeanFactory()); //null//层级的BeanFactory,创建一个父容器HierarchicalBeanFactory parentBeanFactory = createBeanFactory();displayBean(beanFactory,"rumenz");displayBean(parentBeanFactory,"superRumenz");//设置父容器beanFactory.setParentBeanFactory(parentBeanFactory);displayBean(beanFactory,"superRumenz");displayBean(parentBeanFactory,"rumenz");//递归查找Bean,双亲委派,先去父容器查找(parentBeanFactory),找不到最后去本地容器(beanFactory)查找displayContainsBean(beanFactory,"superRumenz");displayContainsBean(parentBeanFactory,"superRumenz");ac.close();}private static void displayBean(HierarchicalBeanFactory beanFactory,String beanName){System.out.println(beanFactory.containsLocalBean(beanName));}private static void displayContainsBean(HierarchicalBeanFactory beanFactory,String beanName){System.out.println(containsBean(beanFactory,beanName));}private static boolean containsBean(HierarchicalBeanFactory beanFactory,String beanName){BeanFactory parentBeanFactory = beanFactory.getParentBeanFactory();if(parentBeanFactory instanceof HierarchicalBeanFactory){HierarchicalBeanFactory hierarchicalBeanFactory = HierarchicalBeanFactory.class.cast(parentBeanFactory);if(containsBean(hierarchicalBeanFactory,beanName)){return true;}}return beanFactory.containsLocalBean(beanName);}private static HierarchicalBeanFactory createBeanFactory(){AnnotationConfigApplicationContext ac=new AnnotationConfigApplicationContext();ac.register(Config.class);ac.refresh();return ac.getBeanFactory();}
}

输出

父容器null
true
true
false
false
true
true


源码:https://github.com/mifunc/Spring-HierarchicalBean

原文: https://rumenz.com/rumenbiji/Spring-HierarchicalBean.html

Spring 层次性依赖查找Bean相关推荐

  1. Spring 延迟依赖查找Bean

    Bean 延迟依赖查找接口 // 一个对象工厂 public interface ObjectFactory<T> {// 返回一个对象T getObject() throws Beans ...

  2. Spring单一类型依赖查找Bean

    单一类型依赖查找接口 - BeanFactory BeanFacotry是spring中比较原始的Factory,BeanFactory是个Factory,也就是IOC容器或对象工厂 根据Bean名称 ...

  3. Spring安全依赖查找

    依赖查找安全性对比 依赖查找类型 代表实现 是否安全 单一类型 BeanFactory#getBean 否 ObjectFactory#getObject 否 ObjectProvider#getIf ...

  4. 【spring容器启动】之bean的实例化和初始化(文末附:spring循环依赖原理)

    本次我们通过源码介绍ApplicationContext容器初始化流程,主要介绍容器内bean的实例化和初始化过程.ApplicationContext是Spring推出的先进Ioc容器,它继承了旧版 ...

  5. SpringIoc依赖查找-5

    1. 依赖查找的今世前生: Spring IoC容器从Java标准中学到了什么? 单一类型依赖查找 JNDI - javax.naming.Context#lookup(javax.naming.Na ...

  6. 万字博客带你全面剖析Spring的依赖注入

    1.写在前面 前面的博客我们已经写了Spring的依赖查找,这篇博客我们来了解写Spring的依赖注入. 2.依赖注入的模式和类型 手动模式 - 配置或者编程的方式, 提前安排注入规则 XML 资源配 ...

  7. Spring高手之路——深入理解与实现IOC依赖查找与依赖注入

    本文从xml开始讲解,注解后面给出 文章目录 1. 一个最基本的 IOC 依赖查找实例 2. IOC 的两种实现方式 2.1 依赖查找(Dependency Lookup) 2.2 依赖注入(Depe ...

  8. Spring的依赖注入和管理Bean

    采用Spring管理Bean和依赖注入 1.实例化spring容器 和 从容器获取Bean对象 实例化Spring容器常用的两种方式: 方法一: 在类路径下寻找配置文件来实例化容器 [推荐使用] Ap ...

  9. Spring依赖查找中的常见异常

    文章目录 BeansException的子接口 NoSuchBeanDefinitionException不存在要查找的Bean NoUniqueBeanDefinitionException 容器中 ...

最新文章

  1. Python scapy库监听网卡,抓取HTTP包
  2. Maven快速导出maven工程的依赖包
  3. eureka同步原理_eureka原理剖析
  4. Go 语言范围(Range)
  5. 2020蓝桥杯省赛---java---B---1(指数计算)
  6. Python3高级 之 协程
  7. 麒麟信安:“一云多芯”信创云桌面解决方案引领者
  8. ActiveMQ集群安装与配置
  9. C语言字符串+内存库函数详解
  10. PowerBI-日期和时间函数-YEAR\QUARTER\MONTH\DAY
  11. 计算机网络篇- 网络层
  12. 圆方树学习笔记 例题 uoj30 Tourists
  13. 行转列 和 链接查询 
  14. 搞事情 | 大数据文摘和ta的朋友们:环游世界的80天
  15. 湖南大学基于SMTP和POP3的邮件系统课程设计
  16. 利用计算机模拟函数图像,计算机模拟实验在教学中的应用论文(2)
  17. 计算机一级等级考试模拟试题,全国计算机一级等级考试模拟试题.docx
  18. 互联网指标体系构建及分析方法
  19. 【C语言】计算机二级C语言程序设计
  20. HP580服务器系统安装,hp580服务器配置

热门文章

  1. openstack的逻辑概念_基本概念 - 深入理解 OpenStack 网络实现 Neutron
  2. L3-029 还原文件 (30 分)-PAT 团体程序设计天梯赛 GPLT
  3. 蓝桥杯 ALGO-72 算法训练 成绩的等级输出
  4. 蓝桥杯 ADV-15算法提高 最大乘积
  5. 蓝桥杯 ADV-62算法提高 夺宝奇兵(动态规划)
  6. 不属于计算机网络的资源词,计算机网络应用试题
  7. windows优化大师怎么用_软件不能用又卸载不掉怎么办——用Windows自家的卸载工具吧(dos级卸载)...
  8. jquery1.8.3和1.11.3的用法区别
  9. Laravel教程 六:表单 Forms
  10. Linux kill 多余用户终端