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;

    @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.java

package 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.java

package 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();
    }
}

输入

父容器null
true
true
false
false
true
true

源码:https://github.com/mifunc/Spr…

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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理