[轉]Spring IOC父子容器簡介
阿新 • • 發佈:2017-10-13
必須 tro 開頭 三方 很多 conf 層級 nfa XML
通過HierarchicalBeanFactory接口,Spring的IoC容器可以建立父子層級關聯的容器體系,子容器可以訪問父容器中的Bean,但父容器不能訪問子容器的Bean。在容器內,Bean的id必須是唯一的,但子容器可以擁有一個和父容器id相同的Bean。父子容器層級體系增強了Spring容器架構的擴展性和靈活性,因為第三方可以通過編程的方式,為一個已經存在的容器添加一個或多個特殊用途的子容器,以提供一些額外的功能。
Spring使用父子容器實現了很多功能,比如在Spring MVC中,展現層Bean位於一個子容器中,而業務層和持久層的Bean位於父容器中。這樣,展現層Bean就可以引用業務層和持久層的Bean,而業務層和持久層的Bean則看不到展現層的Bean。
應用舉例
Runner.java
//這個類負責啟動父容器 public class Runner { public static void main(String[] args){ ApplicationContext context = new ClassPathXmlApplicationContext("classpath*:/spring1.xml"); } }
PluginLoader.java
public class PluginLoader implements ApplicationContextAware { ApplicationContext parentApplicationContext; ConfigurableApplicationContext childContext;public void load() { //掃描所有classpath下面的以plugin_開頭spring的配置文件進行裝配,這裏約定所有的子容器插件都必須有一個以plugin_開頭的配置文件,並通過這個文件被父容器加載 childContext = new ClassPathXmlApplicationContext("classpath*:/plugin_*.xml"); childContext.setParent(parentApplicationContext); childContext.refresh(); }public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.parentApplicationContext = applicationContext; } }
可以看到父容器(spring1.xml):
<bean id="parentClass" class="com.test1.ParentClass"></bean> <bean id="pluginLoader" class="com.test1.PluginLoader" init-method="load"></bean>
子容器(plugin_1.xml):
<bean id="childContext1" class="com.test1.child.ChildContext1"></bean>
[轉]Spring IOC父子容器簡介