2014-01-17 38 views
0

是否可以將Spring AOP應用於在與AOP配置不同的應用程序上下文中聲明的bean?我有2個應用程序上下文: dataApplicationContext.xmlwebApplicationContext.xml。我想在webApplicationContext.xml聲明一個方面攔截在定義dataApplicationContext.xml將Spring AOP應用於來自不同應用上下文的bean

dataApplicationContext.xml被包括在主的applicationContext.xml上下文文件豆的方法執行它從main(String args[])入口點引導。 webApplicationContext.xml由部署在Jetty嵌入式實例中的ContextLoaderListener獨立加載。

ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(new String[] { "applicationContext.xml"}); 
ctx.registerShutdownHook(); 

Server server = ctx.getBean(Server.class); 

DispatcherServlet dispatcherServlet = new DispatcherServlet(); 
      dispatcherServlet.setContextConfigLocation("classpath:webApplicationContext.xml"); 

ServletHolder servletHolder = new ServletHolder(dispatcherServlet); 
ServletContextHandler context = new ServletContextHandler(); 
context.setContextPath("/"); 
context.addEventListener(new ContextLoaderListener()); 
context.setInitParameter("contextConfigLocation", 
     "classpath*:**/webApplicationContext.xml"); 
context.addServlet(servletHolder, "/*"); 
context.setSessionHandler(new SessionHandler()); 

謝謝。

+0

我看到了編輯,並有一個問題,在你的問題中,你提到了webappContext。xml使用ContextLoaderListener加載,但在代碼中,它是從Dispatcher Servlet加載的。此外,它基本上表示相同,那麼您的web應用程序上下文將是調度程序servlet的上下文,applicationContext.xml將是根上下文。對? – Hrishikesh

+0

是的,情況完全相同。例如,我嘗試了它,並且在webApplicationContext.xml中聲明方面時,根本沒有方法攔截。 – Nedo

回答

1

如果你的spring應用程序加載了這兩個上下文文件,它應該可以直接使用。如果沒有,您有2個選項:

  • 製作包含上下文文件的父上下文文件。
  • 包含另一個上下文文件。所以在這種情況下,我假設你的webApplicationContext.xml將包含dataApplicationContext.xml。
0

可以肯定做到這一點只要你的dataApplicationContext.xml使用org.springframework.web.context.ContextLoaderListener 和你 webApplicationContext.xml使用DispatcherServlet

之所以被加載,默認情況下,Spring容器創建兩個上下文加載。 root application context並且每個分派的Servlet都有自己的web application context

彈簧文檔明確提到了這一點

正如在標題爲第3.8節「的 ApplicationContext」中詳述,在Spring中的ApplicationContext實例可以 作用域。在Web MVC框架中,每個DispatcherServlet都有其自己的 WebApplicationContext,它繼承了根WebApplicationContext已在 中定義的所有Bean。定義的這些繼承bean可以在特定於servlet的範圍中重寫 ,並且可以爲給定的servlet實例定義新的特定於作用域的bean 。

,因此,你會在你的root application context指定bean定義可以通過您的調度員servlet的webapplication context

在你的情況可以訪問,提供的第一行是真實的,你可以訪問從AOP的聲明webApplicationContext.xml,因爲這是您的Web上下文,它可以訪問根上下文。

相關問題