2011-05-18 16 views
10

Bir DispatcherServlet kullanarak önyüklenen bir Spring MVC web uygulamasıyla uğraşıyorum. Web Uygulaması Bağlamında Yayılan Bağlam Hiyerarşisi

<servlet> 
    <servlet-name>springmvc</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet 
    </servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>classpath:springmvc-servlet.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

Şimdi bir ContextSingletonBeanFactoryLocator kullanarak çalışma zamanında yüklenen gereken bazı modüller vardır: Bu tüm uygulamayı yöneten bir XmlWebApplicationContext yaratır. Bu nedenle, her modülün kendi ClasspathXmlApplicationContext vardır. Bir modül, XmlWebApplicationContext'dan fasulye referansı alabilmesi için, XmlWebApplicationContext'un üstlenmenin rolünü üstlenmesi ve ClasspathXmlApplicationContext modülünün alt bağlamının rolünü oynaması gereken bir Bağlam Hiyerarşisi oluşturmak için XmlWebApplicationContext'a eklenmelidir. Ne yazık ki ben WebApplicationContext adını parentContext vermek için hiçbir şekilde bugüne kadar buldum çünkü

<beans> 
    <bean id="moduleContext" 
     class="org.springframework.context.support.ClassPathXmlApplicationContext"> 
     <constructor-arg> 
      ... 
     </constructor-arg> 
     <constructor-arg ref="parentContext" /> 
    </bean> 
</beans> 

kullanarak bunları bağlanamıyor değilim. Bir şeyi gözden kaçırdım mı yoksa farklı bir şekilde aynı şeyi elde etmenin daha iyi/daha kolay bir yolu var mı?

cevap

2

ek açıklamalar kullanıyorsanız, bunu yapabilirsiniz:

@Inject 
private XmlWebApplicationContext context; 

@Inject 
private List<ClassPathXmlApplicationContext> childs; 

@PostConstruct 
public void refreshContext() { 
    for(ClassPathXmlApplicationContext appContext : childs) { 
     appContext.setParent(context); 
    } 
    context.refresh(); 
} 

Sen arayüzleri kullanarak InitializingBean ve ApplicationContextAware tarafından da ek açıklamalar olmadan yapabilirsiniz.

Edited: Yay ClassPathXmlApplicationContext bir örneği olarak tüm fasulye enjekte böylecechilds, türüne göre autowired edilir.

+0

Onları önceden tanımıyorsam nereden childs'ları alıyorum? – aha

+0

Teklif ettiğiniz kodu denedim. Çalışır, ancak 'ContextSingletonBeanFactoryLocator' öğesine yayılmaz. Ancak, doğru yönde ilerliyor: Gitmenin yolu, 'ContextSingletonBeanFactoryLocator' kullanmak değil, manüel içerikleri ('GenericApplicationContext' kullanarak) elle yüklemek ve bunları' InitializingBean'daki ana içeriğe eklemek. – aha