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
分析过程:
- 在bean factory被加载过程中分别加载各层Bean Factory,
- BeanFactory parent = new XmlBeanFactory(new FileSystemResource("build/parent.xml"));
- BeanFactory child = new XmlBeanFactory(new FileSystemResource("build/beans.xml" ), parent);
- 其中parent参数指定了bean factory间的父子关系。
分析结果:
- 第一行结果为在父factory中定义的参数,说明在子fantory中可以直接调用父fantory元素,类似于java中的继承关系。
- 第二行结果说明 < ref local ="injectBean" />中local指向本fantory元素。
- 第三行结果为Bean In Parent,说明 < ref parent ="injectBean" />中parent指向父fantory中元素。
- 在bean factory被加载过程中分别加载各层Bean Factory,
- BeanFactory parent = new XmlBeanFactory(new FileSystemResource("build/parent.xml"));
- BeanFactory child = new XmlBeanFactory(new FileSystemResource("build/beans.xml" ), parent);
- 其中parent参数指定了bean factory间的父子关系。
分析结果:
- 第一行结果为在父factory中定义的参数,说明在子fantory中可以直接调用父fantory元素,类似于java中的继承关系。
- 第二行结果说明 < ref local ="injectBean" />中local指向本fantory元素。
- 第三行结果为Bean In Parent,说明 < ref parent ="injectBean" />中parent指向父fantory中元素。
- 第一行结果为在父factory中定义的参数,说明在子fantory中可以直接调用父fantory元素,类似于java中的继承关系。
- 第二行结果说明 < ref local ="injectBean" />中local指向本fantory元素。
- 第三行结果为Bean In Parent,说明 < ref parent ="injectBean" />中parent指向父fantory中元素。