gpt4 book ai didi

java - Spring MVC : Using @Autowire is getting references to different spring bean instances

转载 作者:行者123 更新时间:2023-12-02 07:41:57 24 4
gpt4 key购买 nike

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

此过滤器使用 @Autowire 来获取对 DataSource Bean 的引用。我还在我的 DAO 中@Autowire 数据源。当我调试时,我看到 Filter 和 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 中注入(inject) bean,如果可能的话。

谢谢!!

-乔

最佳答案

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

关于java - Spring MVC : Using @Autowire is getting references to different spring bean instances,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11457914/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com