java - WEB-INF/myproject-servlet.xml 与 WEB-INF/web.xml

标签 java xml spring

我花了几天时间修复我的 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-paramweb.xml对于相同的对象。

我的问题是,“Bean 已经存在”错误是否可能由此而来?我几乎可以肯定是的,我检查了所有 beans id,没有重复。

所以我还有一个问题。这样做的好方法是什么?当我创建新的配置文件时,我应该在哪里通知我的应用程序?在 myproject-servlet.xmlweb.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在里面我有基于类 ClassAClassB 的 bean。

假设我们有如下 id 的 bean:

ClassA: ida1, ida2
ClassB: idb1, idb2

所以,我正在运行我的 jetty 服务器,问题是:

将初始化哪些 beans? 我只声明了包 com.my.pckg.a , 所以来自 myconfig.xml , Spring 应该只加载 ida1ida2但此文件还包含另一个类的 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/

相关文章:

java - MariaDB 功能索引

java - 是否可以从Java代码调用数据库触发器?

java - 没有制定目标 NDK 的规则

java - 将节点转换为元素时出现 Dom XML 解析器异常

java - "Invalid content was found starting with element ' http :basicAuthSupplier '" while building Apache CXF project

java - 如何以编程方式使图像适合 ImageButton

c# - 在 XML 文档中搜索

php - jQuery 将 XML 返回的字段名称大写?

java - 如何在 Spring Data Jpa 中使用投影返回自定义对象?

java - Hibernate 和 jOOQ 共享事务