0

我在我的 Spring 应用程序上下文文件中定义了一个 UserCredetniasDatSourceAdapter。我还通过 DelegatingFilterProxy 向 Spring 添加了一个自定义过滤器。

该过滤器使用@Autowire 来获取对DataSource Bean 的引用。我还在我的 DAO 中 @Autowire 数据源。当我调试时,我看到过滤器和 DAO 实例中数据源的不同实例 ID。为什么默认情况下有 2 个实例是单例?

我还启动了 jvisualvm 并查看了堆,我的应用程序上下文中的所有 bean 都有 2 个实例?感谢您提供任何见解,也许 bean 前/后处理与它有关,或者我不应该在过滤器中使用 @Autowire。任何帮助都是值得的。谢谢!

编辑

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config-context.xml</param-value>
 </context-param>

 <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
 </servlet>

<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.html</url-pattern>
 </servlet-mapping>

 <init-param>
<param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/web-context.xml,/WEB-INF/config-context.xml</param-value>
 </init-param>

有趣的是,我想我知道它发生了什么。因为有 2 个上下文,所以有 2 个实例。我假设一个用于应用程序,一个用于每个请求(线程)?有没有办法指定使用哪个上下文?也许过滤器不是答案,我需要使用 AOP。如果可能的话,需要研究如何在@Aspect 中注入 bean。

谢谢!!

-乔

4

1 回答 1

2

您正在将您的/WEB-INF/config-context.xml作为根应用程序上下文(由 加载的一个ContextLoaderListener)以及 Web 上下文(由 加载DispatcherServlet)的一部分导入。您可能可以将其从 for 中删除DispatcherServlet

于 2012-07-12T18:39:22.530 回答