将Spring AOP应用于来自不同应用程序上下文的bean

时间:2014-01-17 12:17:40

标签: java spring aop spring-aop

是否可以将Spring AOP应用于在不同于AOP配置的应用程序上下文中声明的bean?我有2个应用程序上下文: dataApplicationContext.xml webApplicationContext.xml 。我想在 webApplicationContext.xml 中声明一个方面来拦截 dataApplicationContext.xml 中定义的bean的方法执行

dataApplicationContext.xml 包含在主{em> applicationContext.xml 上下文文件中,该文件从main(String args[])入口点启动。 webApplicationContext.xml ContextLoaderListener逐个加载,部署在Jetty的嵌入式实例中。

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());

感谢。

2 个答案:

答案 0 :(得分:1)

如果你的spring应用程序加载了两个上下文文件,它应该是开箱即用的。如果没有,您有两个选择:

  • 制作包含上下文文件的父上下文文件。
  • 包含另一个上下文文件。所以在这种情况下,我假设您的webApplicationContext.xml将包含dataApplicationContext.xml。

答案 1 :(得分:0)

如果使用dataApplicationContext.xml加载了org.springframework.web.context.ContextLoaderListener,您肯定可以这样做 和你的 使用webApplicationContext.xml

加载DispatcherServlet

原因是,默认情况下,Spring容器会创建两个上下文。 root application context和每个Dispatched Servlet都有自己的web application context

Spring文档明确提到了这个

  

详见第3.8节“The   ApplicationContext“,Spring中的ApplicationContext实例可以   作用域。在Web MVC框架中,每个DispatcherServlet都有自己的   WebApplicationContext,它继承了已定义的所有bean   根WebApplicationContext。这些继承的bean定义可以   在特定于servlet的范围中重写,以及新的特定于范围的bean   可以在给定的servlet实例的本地定义。

因此,调度程序servlet的root application context

可以访问您在webapplication context中指定的bean定义

在您的情况下,如果第一行为true,您可以从webApplicationContext.xml访问AOP声明,因为这是您的Web上下文,它可以访问根上下文。