2012-07-12 139 views
0

我在我的Spring应用上下文文件中定义了UserCredetnialsDatSourceAdapter。我也有一个通过DelegatingFilterProxy添加到Spring的自定义过滤器。Spring MVC:使用@Autowire获取对不同spring bean实例的引用

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

我也解雇了jvisualvm,我看着堆和我的应用程序中的所有我的bean有2个实例?感谢任何见解,也许豆前/后处理有一些事情做,或者我不应该在过滤器中使用@Autowire。任何帮助apprciated。谢谢!

编辑

<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个上下文。一个为应用程序和1为每个请求(线程)我假设?有没有一种方法可以指定使用哪种上下文?也许过滤器不是答案,我需要使用AOP。需要研究如何在@Aspect中注入一个bean,如果这是可能的话。

谢谢!

-Joe

+2

你可以发布你的web.xml文件吗?检查您是否没有构建使用相同配置文件的两个不同的应用程序上下文。 – Luciano 2012-07-12 18:11:57

+1

您的应用程序上下文是否实例化了两次,一次是通过web.xml并且一次是在代码中? – GriffeyDog 2012-07-12 18:15:39

回答

2

您导入您的/WEB-INF/config-context.xml作为根应用程序上下文(一个由ContextLoaderListener装起来),以及您的网络环境(由DispatcherServlet加载)的一部分。您可以将其从DispatcherServlet中删除。

+0

感谢Luciano和GriffyDog的快速反应,使我得到了答案,并向Biju提供了解释。 – user943583 2012-07-12 19:26:08