层次性依赖查找接口 - 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; @Override public 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; } @Override public String toString() { return "SuperRumenz{" + "key='" + key + '\'' + '}'; }}
配置类Config.java / Config1.java
package com.rumenz;import org.springframework.context.annotation.Bean;public class Config { @Bean public SuperRumenz superRumenz(){ SuperRumenz s=new SuperRumenz(); s.setKey("超级管理员"); return s; }}// Config1.javapackage com.rumenz;import org.springframework.context.annotation.Bean;public class Config1 { @Bean public 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(); }}
输入
父容器nulltruetruefalsefalsetruetrue
源码:https://github.com/mifunc/Spr...
原文: https://rumenz.com/rumenbiji/Spring-HierarchicalBean.html