层次性依赖查找接口 - 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