我花了几天时间修复我的 Spring 项目中的错误。很长一段时间以来,我在错误日志中的主要问题是:
Bean already exists
我有两个文件:
WEB-INF/myproject-servlet.xml
WEB-INF/web.xml
在第一个中,我可以输入以下内容(假设我有一个管理动物园动物的应用程序):
<context:component-scan base-package="com.my.package.animals" />
这样(据我所知)我们启用了 Spring bean 自动发现。所以现在,当我们运行我们的应用程序时,Spring 将从这个包中获取所有类,稍后它将遍历 resources
中的所有配置文件。目录并将初始化所有 bean(放置在与给定包关联的配置文件中)。
第二个,web.xml
包括这样的行
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/myproject-servlet.xml</param-value>
</context-param>
我还可以放置我的配置文件的路径,例如:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:animals-config.xml</param-value>
</context-param>
所以现在,我在 myproject-servlet.xml
中有“自动检测”功能我有 context-param
在 web.xml
对于相同的对象。
我的问题是,“Bean 已经存在”错误是否可能由此而来?我几乎可以肯定是的,我检查了所有 beans id,没有重复。
所以我还有一个问题。这样做的好方法是什么?当我创建新的配置文件时,我应该在哪里通知我的应用程序?在 myproject-servlet.xml
或 web.xml
.我真的需要清理我的应用程序,我将从那里开始。
我检查了一些例子,人们宁愿不要放多于一个 <context-param>
在 web.xml
文件 Simple example
提前致谢
好的,我真的很接近解决我的问题了。
假设我有两个包:
com.my.pckg.a
com.my.pckg.b
与类
com.my.pckg.a.ClassA
com.my.pckg.b.ClassB
我在 myproject-servlet.xml
中添加了下一行:
<context:component-scan base-package="com.my.pckg.a" />
我有一个配置文件 myconfig.xml
在里面我有基于类 ClassA 和 ClassB 的 bean。
假设我们有如下 id 的 bean:
ClassA: ida1, ida2
ClassB: idb1, idb2
所以,我正在运行我的 jetty 服务器,问题是:
将初始化哪些 beans? 我只声明了包 com.my.pckg.a
, 所以来自 myconfig.xml
, Spring 应该只加载 ida1
和 ida2
但此文件还包含另一个类的 bean。
所以最后...?
终于,我想我发现了一个问题。在 web.xml
文件我有一行:
<context:component-scan base-package="com.dirty.pckg" />
在这个包中我有一个类 DirtyClass
与 @Controller
注解。该类的其中一个字段是:
private static ApplicationContext context = new ClassPathXmlApplicationContext("dirty-config.xml");
所以,当我的应用程序启动时,Spring 需要 DirtyClass
(因为它有 @
)并映射它。因为操作系统 static
触发阅读的上下文修饰符 dirty-config.xml
.这就是我无法理解为什么我的代码以奇怪的方式运行的原因。
最佳答案
web.xml
文件是您的网络应用程序的配置。它与 Spring 无关。
contextConfigLocation
context-param 是一个用于搜索 Spring 配置文件的 spring 监听器。它与 Spring 有关。
您可以在 web.xml
中注册多个 spring 配置文件,但这些文件不能定义相同的 bean(bean id 必须不同)。您也可以只有一个 spring 配置文件,它将自行包含其他配置文件,如下所述:http://www.mkyong.com/spring/load-multiple-spring-bean-configuration-file/
另一个问题的答案:
当您添加组件扫描时,您要求 spring 扫描包 com.my.pckg.a
以获取 @Service、@Component 等注释,...组件扫描不是过滤器对于其余的配置,它本身就是一个配置。所以您添加组件扫描的事实不会改变 myconfig.xml 的行为。 ida1、ida2和idb1、idb2都会被实例化。
我真的不明白你试图用你的配置文件完成什么。也许如果您说明您的需求,我们可以帮助您为您设置正确的配置。
关于java - WEB-INF/myproject-servlet.xml 与 WEB-INF/web.xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22805512/