BeanFactory父子容器的知识

容器知识点1:

在Spring中,关于父子容器相关的接口HierarchicalBeanFactory,以下是该接口的代码:

public interface HierarchicalBeanFactory extends BeanFactory {
    BeanFactory getParentBeanFactory();    //返回本Bean工厂的父工厂
    boolean containsLocalBean(String name); //本地工厂是否包含这个Bean
}

其中:

1、第一个方法getParentBeanFactory(),返回本Bean工厂的父工厂。这个方法实现了工厂的分层。

2、第二个方法containsLocalBean(),判断本地工厂是否包含这个Bean(忽略其他所有父工厂)。

以下会举例介绍该接口在实际实践中应用:

(1)、定义一个Person类:

class Person {
    private int age;
    private String name;
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

(2)、首先需要定义两个容器定义的xml文件

childXml.xml:

<bean id="child" class="com.spring.hierarchical.Person">
        <property name="age" value= "11"></property>
        <property name="name" value="erzi"></property>
    </bean>

parentXml.xml:

<bean id="parent" class="com.spring.hierarchical.Person">
        <property name="age" value= "50"></property>
        <property name="name" value="baba"></property>
    </bean>

(3)、写测试代码:

public class Test {
    public static void main(String[] args) {
        //父容器
        ApplicationContext parent = new ClassPathXmlApplicationContext("parentXml.xml");
        //子容器,在构造方法中指定
        ApplicationContext child = new ClassPathXmlApplicationContext(new String[]{"childXml.xml"},parent);

        System.out.println(child.containsBean("child"));  //子容器中可以获取Bean:child
        System.out.println(parent.containsBean("child")); //父容器中不可以获取Bean:child
        System.out.println(child.containsBean("parent")); //子容器中可以获取Bean:parent
        System.out.println(parent.containsBean("parent")); //父容器可以获取Bean:parent
        //以下是使用HierarchicalBeanFactory接口中的方法
        ApplicationContext parent2 = (ApplicationContext) child.getParentBeanFactory();  //获取当前接口的父容器
        System.out.println(parent == parent2);
        System.out.println(child.containsLocalBean("child"));  //当前子容器本地是包含child
        System.out.println(parent.containsLocalBean("child")); //当前父容器本地不包含child
        System.out.println(child.containsLocalBean("parent")); //当前子容器本地不包含child
        System.out.println(parent.containsLocalBean("parent")); //当前父容器本地包含parent
    }
}

原文地址:https://www.cnblogs.com/mayang2465/p/12163179.html

时间: 2024-11-09 05:59:52

BeanFactory父子容器的知识的相关文章

Spring和SpringMVC父子容器关系初窥

一.背景 最近由于项目的包扫描出现了问题,在解决问题的过程中,偶然发现了Spring和SpringMVC是有父子容器关系的,而且正是因为这个才往往会出现包扫描的问题,我们在此来分析和理解Spring和SpringMVC的父子容器关系并且给出Spring和SpringMVC配置文件中包扫描的官方推荐方式. 二.概念理解和知识铺垫 在Spring整体框架的核心概念中,容器是核心思想,就是用来管理Bean的整个生命周期的,而在一个项目中,容器不一定只有一个,Spring中可以包括多个容器,而且容器有上

spring父子容器

通过HierarchicalBeanFactory接口,Spring的IoC容器可以建立父子层级关联的容器体系,子容器可以访问父容器中的Bean,但父容器不能访问子容器的Bean.在容器内,Bean的id必须是唯一的,但子容器可以拥有一个和父容器id相同的Bean.父子容器层级体系增强了Spring容器架构的扩展性和灵活性,因为第三方可以通过编程的方式,为一个已经存在的容器添加一个或多个特殊用途的子容器,以提供一些额外的功能. Spring使用父子容器实现了很多功能,比如在Spring MVC中

好记性不如烂笔头83-spring3学习(4)-spring的BeanFactory(IoC容器)

我们一般把BeanFactory叫做IoC容器,叫ApplicationContext 为应用上下文(或者Spring容器) BeanFactory是spring框架的核心,实现依赖注入[使个组件的依赖关系从代码中独立出来,使用配置文件即可实现这种依赖关系]和bean声明周期的管理 . BeanFactory[IoC容器]启动过程:分为两个阶段,一个是容器启动阶段,另外一个是Bean实例化阶段 容器启动阶段:加载配置 -–> 分析配置信息 -–>装备到BeanDefinition -–>

spring父子容器的问题

这几天做项目碰到一个问题,就是把配置文件中的参数往controller中注入的时候注入不进去,查了资料,发现是spring父子容器的原因, springmvc是spring的子容器,spring是父容器,spring规定子容器可以访问父容器,而父容器不能访问子容器,这就导致在spring容器中初始化 的数据无法直接注入springmvc容器中 解决方法:间接获取. 我们新建个Service,把配置文件中的数据注入到service中(在spring容器中),再通过controller主动去获取Se

SpringMvc父子容器

使用监听器listener来加载spring的配置文件:如下 <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-beans.xml</param-value> </context-param> <listener> <listener-class>org.springframe

Spring 父子容器

必须要说的是,父子容器是通过设置形成的关系. 容器实现了ConfigurableApplicationContext或ConfigurableBeanFactory接口,这两个接口中分别有setParent及setParentBeanFactory方法,可以将指定容器设置为当前容器的父容器. 首先,默认情况下,Spring + SpringMVC 框架的web项目,会先创建WebApplicationContext(应用上下文环境,就是IoC容器啦),并以WebApplicationContex

spring的父子容器

在创建ssm项目工程时,经常需要读取properties资源配置文件,传统的方法当然可以. 但是spring提供了更简便的方法,@value注解. 在page.properties文件中,配置分页信息. 这个时候,发现在Service层用@value("${PAGESIZE}")可以取到10. 然而在controller中同样的注解却不起作用了. 原来,这涉及到了spring的父子容器问题. spring和springmvc都是容器.spring是父容器,springmvc是子容器.

Spring和SpringMVC父子容器关系所引发的血案

一.背景 最近在使用工具类实现将数据库中的数据批量导入到Solr索引库的时候,使用单元测试提示: java.lang.IllegalStateException: Failed to load ApplicationContext 在解决问题的过程中,偶然发现了Spring和SpringMVC是有父子容器关系的,正是由于这种父子容器关系的存在,导致了问题的存在. 二.错误重现 下面是我的测试类: public class SolrUtil { @Autowired private GoodsDa

Spring中父子容器的实现实例

Spring中父子容器的实现实例Spring的父子容器可以通过ConfigurableApplicationContext或ConfigurableBeanFactory来实现,这两个接口中分别有setParent及setParentBeanFactory方法,可以与当前的子容器进行父子容器关联,这个时候子容器就可以引用父容器中的bean,但是父容器是不能够引用子容器中的bean的,并且各个子容器中定义的bean是互不可见的,这样也可以避免因为不同的插件定义了相同的bean而带来的麻烦.应用场景