Spring 层次性依赖查找Bean
层次性依赖查找接口 - 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相关推荐
- Spring 延迟依赖查找Bean
Bean 延迟依赖查找接口 // 一个对象工厂 public interface ObjectFactory<T> {// 返回一个对象T getObject() throws Beans ...
- Spring单一类型依赖查找Bean
单一类型依赖查找接口 - BeanFactory BeanFacotry是spring中比较原始的Factory,BeanFactory是个Factory,也就是IOC容器或对象工厂 根据Bean名称 ...
- Spring安全依赖查找
依赖查找安全性对比 依赖查找类型 代表实现 是否安全 单一类型 BeanFactory#getBean 否 ObjectFactory#getObject 否 ObjectProvider#getIf ...
- 【spring容器启动】之bean的实例化和初始化(文末附:spring循环依赖原理)
本次我们通过源码介绍ApplicationContext容器初始化流程,主要介绍容器内bean的实例化和初始化过程.ApplicationContext是Spring推出的先进Ioc容器,它继承了旧版 ...
- SpringIoc依赖查找-5
1. 依赖查找的今世前生: Spring IoC容器从Java标准中学到了什么? 单一类型依赖查找 JNDI - javax.naming.Context#lookup(javax.naming.Na ...
- 万字博客带你全面剖析Spring的依赖注入
1.写在前面 前面的博客我们已经写了Spring的依赖查找,这篇博客我们来了解写Spring的依赖注入. 2.依赖注入的模式和类型 手动模式 - 配置或者编程的方式, 提前安排注入规则 XML 资源配 ...
- Spring高手之路——深入理解与实现IOC依赖查找与依赖注入
本文从xml开始讲解,注解后面给出 文章目录 1. 一个最基本的 IOC 依赖查找实例 2. IOC 的两种实现方式 2.1 依赖查找(Dependency Lookup) 2.2 依赖注入(Depe ...
- Spring的依赖注入和管理Bean
采用Spring管理Bean和依赖注入 1.实例化spring容器 和 从容器获取Bean对象 实例化Spring容器常用的两种方式: 方法一: 在类路径下寻找配置文件来实例化容器 [推荐使用] Ap ...
- Spring依赖查找中的常见异常
文章目录 BeansException的子接口 NoSuchBeanDefinitionException不存在要查找的Bean NoUniqueBeanDefinitionException 容器中 ...
最新文章
- Python scapy库监听网卡,抓取HTTP包
- Maven快速导出maven工程的依赖包
- eureka同步原理_eureka原理剖析
- Go 语言范围(Range)
- 2020蓝桥杯省赛---java---B---1(指数计算)
- Python3高级 之 协程
- 麒麟信安:“一云多芯”信创云桌面解决方案引领者
- ActiveMQ集群安装与配置
- C语言字符串+内存库函数详解
- PowerBI-日期和时间函数-YEAR\QUARTER\MONTH\DAY
- 计算机网络篇- 网络层
- 圆方树学习笔记 例题 uoj30 Tourists
- 行转列 和	链接查询
- 搞事情 | 大数据文摘和ta的朋友们:环游世界的80天
- 湖南大学基于SMTP和POP3的邮件系统课程设计
- 利用计算机模拟函数图像,计算机模拟实验在教学中的应用论文(2)
- 计算机一级等级考试模拟试题,全国计算机一级等级考试模拟试题.docx
- 互联网指标体系构建及分析方法
- 【C语言】计算机二级C语言程序设计
- HP580服务器系统安装,hp580服务器配置
热门文章
- openstack的逻辑概念_基本概念 - 深入理解 OpenStack 网络实现 Neutron
- L3-029 还原文件 (30 分)-PAT 团体程序设计天梯赛 GPLT
- 蓝桥杯 ALGO-72 算法训练 成绩的等级输出
- 蓝桥杯 ADV-15算法提高 最大乘积
- 蓝桥杯 ADV-62算法提高 夺宝奇兵(动态规划)
- 不属于计算机网络的资源词,计算机网络应用试题
- windows优化大师怎么用_软件不能用又卸载不掉怎么办——用Windows自家的卸载工具吧(dos级卸载)...
- jquery1.8.3和1.11.3的用法区别
- Laravel教程 六:表单 Forms
- Linux kill 多余用户终端