`

HierarchicalBeanFactory:分层的Bean工厂

 
阅读更多

 Sub-interface implemented by bean factories that can be part of a hierarchy.

 

HierarchicalBeanFactory 表示的是这些 Bean 是有继承关系的,也就是每个Bean 有可能有父 Bean

 

public interface HierarchicalBeanFactory extends BeanFactory {
    BeanFactory getParentBeanFactory();    //返回本Bean工厂的父工厂
    boolean containsLocalBean(String name); //本地工厂是否包含这个Bean
}
       1、第一个方法返回本Bean工厂的父工厂。这个方法实现了工厂的分层。

  2、第二个方法判断本地工厂是否包含这个Bean(忽略其他所有父工厂)。这也是分层思想的体现。

总结:这个工厂接口非常简单,实现了Bean工厂的分层。这个工厂接口也是继承自BeanFacotory,也是一个二级接口,相对于父接口,它只扩展了一个重要的功能——工厂分层。

 

 

parent.xml

 

 <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 
      "http://www.springframework.org/dtd/spring-beans.dtd">
  <beans>
      <bean id="injectBean" class="java.lang.String">
            <constructor-arg>
                 <value>Bean In Parent</value>
             </constructor-arg>
      </bean>
     <bean id="injectBeanParent" class="java.lang.String">
            <constructor-arg>
                <value>Bean In Parent</value>
            </constructor-arg>
     </bean>
 </beans>  
 
beans.xml
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 
    "http://www.springframework.org/dtd/spring-beans.dtd">
  <beans>
      <!-- hierarchical bean factories -->
      <bean id="target1" class="SimpleTarget">
          <property name="val">
              <ref bean="injectBeanParent"/>
          </property>
     </bean>
     <bean id="target2" class="SimpleTarget">
         <property name="val">
             <ref local="injectBean"/>
         </property>
     </bean>
     <bean id="target3" class="SimpleTarget">
         <property name="val">
             <ref parent="injectBean"/>
         </property>
     </bean>
     <bean id="injectBean" class="java.lang.String">
            <constructor-arg>
                <value>Bean In Child</value>
            </constructor-arg>
     </bean>
 </beans>
 
SimpleTarget中只有一属性String val

 

  public static void main(String[] args) {
          BeanFactory parent = new XmlBeanFactory(new FileSystemResource(
                  "build/parent.xml"));
          BeanFactory child = new XmlBeanFactory(new FileSystemResource(
                  "build/beans.xml"), parent);
  
          SimpleTarget target1 = (SimpleTarget) child.getBean("target1");
          SimpleTarget target2 = (SimpleTarget) child.getBean("target2");
          SimpleTarget target3 = (SimpleTarget) child.getBean("target3");
 
         System.out.println(target1.getVal());
         System.out.println(target2.getVal());
         System.out.println(target3.getVal());
     }
 
运行结果: 
  • Bean In Parent
  • Bean In Child
  • Bean In Parent 
分析过程:
  1. 在bean factory被加载过程中分别加载各层Bean Factory,
  2. BeanFactory parent  = new XmlBeanFactory(new FileSystemResource("build/parent.xml"));
  3. BeanFactory child = new XmlBeanFactory(new FileSystemResource("build/beans.xml" ), parent);
  4. 其中parent参数指定了bean factory间的父子关系。 
分析结果: 
  1. 第一行结果为在父factory中定义的参数,说明在子fantory中可以直接调用父fantory元素,类似于java中的继承关系。
  2. 第二行结果说明 < ref  local ="injectBean" />中local指向本fantory元素。
  3. 第三行结果为Bean In Parent,说明 < ref  parent ="injectBean" />中parent指向父fantory中元素。
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics