HierarchicalBeanFactory层次化的工厂类
public interface HierarchicalBeanFactory extends BeanFactory {
/**
* Return the parent bean factory, or {@code null} if there is none.
*/
BeanFactory getParentBeanFactory();
/**
* Return whether the local bean factory contains a bean of the given name,
* ignoring beans defined in ancestor contexts.
* <p>This is an alternative to {@code containsBean}, ignoring a bean
* of the given name from an ancestor bean factory.
* @param name the name of the bean to query
* @return whether a bean with the given name is defined in the local factory
* @see BeanFactory#containsBean
*/
boolean containsLocalBean(String name);
}
在创建容器的过程中也可以传入父类的容器,配置如下
父类XML配置(parent.xml):
<bean class="java.lang.String" id="parentname">
<constructor-arg value="parent"/>
</bean>
子类(child.xml):
<bean class="com.he.hierarchicalIOC.Entity" id="entity2">
<property name="name">
<ref parent="parentname"/>
</property>
</bean>
<bean class="java.lang.String" id="childname">
<constructor-arg value="childname"/>
</bean>
<bean class="com.he.hierarchicalIOC.Entity" id="entity3">
<property name="name">
<ref local="childname"/>
</property>
</bean>
子类创建容器的过程中传入父类的容器:
public class APP
{
public static void main(String[] args) {
ApplicationContext parent = new ClassPathXmlApplicationContext("com/he/hierarchicalIOC/parent.xml");
ApplicationContext child = new ClassPathXmlApplicationContext(new String[]{"child.xml"},parent);
Entity entiy1 = (Entity)child.getBean("entity1");
Entity entiy2 = (Entity)child.getBean("entity2");
Entity entiy3 = (Entity)child.getBean("entity3");
entiy1.performance();
entiy2.performance();
entiy3.performance();
System.out.println(ClassLoader.getSystemClassLoader());
System.out.println(ClassLoader.getSystemClassLoader().getParent());
}
}
输出结果如下:
hellochild
helloparent
hellochildname
sun.misc.Launcher$AppClassLoader@16b98e56
sun.misc.Launcher$ExtClassLoader@75a1cd57