spring - @Service 被构造了两次

标签 spring spring-mvc

我的 Spring 应用程序出现问题,我的 @Service 类在应用程序启动时被创建了两次。我知道这是我的配置有问题,因为我以前经历过,但我到底做错了什么?

我在下面布置配置的方式有什么根本错误吗? (我省略了所有我认为不相关的内容)

web.xml:

<servlet>
    <servlet-name>myapp</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>myapp</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

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

<listener>
    <listener-class>com.myapp.servlet.MyAppContextListener</listener-class>
</listener>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

myapp-servlet.xml

<context:component-scan base-package="com.myapp" annotation-config="true" />
<mvc:annotation-driven />

myapp-config.xml

<context:component-scan base-package="com.myapp" annotation-config="true" />
<context:annotation-config />

最佳答案

除了@GaryF's answer ,对于这个问题有以下漂亮的解决方案(用于 Spring Roo 生成的项目):

myapp-config.xml

<!-- Load everything except @Controllers -->
<context:component-scan base-package="com.myapp">
    <context:exclude-filter expression="org.springframework.stereotype.Controller"
        type="annotation"/>
</context:component-scan>

myapp-servlet.xml

<!-- Load @Controllers only -->
<context:component-scan base-package="com.myapp" use-default-filters="false">
    <context:include-filter expression="org.springframework.stereotype.Controller" 
        type="annotation"/>
</context:component-scan>

编辑:

删除 <context:component-scan>来自 myapp-config.xml意味着,所有自动发现的带注释的 bean 都在 DispatcherServlet 中注册。的上下文(即从 myapp-servlet.xml 加载的上下文)。

但是,推荐的方法是使用 servlet 的上下文来处理特定于表示的事物(例如 Controller ),并将根上下文 ( myapp-config.xml ) 用于应用程序的核心服务。上面的解决方案使这种方法变得容易。

关于实际考虑,当您的核心服务被放置在 servlet 的应用程序上下文中时,不能从该 servlet 范围之外访问它们,例如,从另一个 servlet(您可能需要使用另一个 servlet 来实现另一个访问技术)或过滤器(例如 Spring Security 过滤器)。这就是在根应用程序上下文中拥有核心服务的原因。

关于spring - @Service 被构造了两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4333390/

相关文章:

java - Cloud Stream中的@EnableBinding后面是做什么的?

java - 使用 Stripes+Spring 与 Spring MVC 的缺点

java - Spring MVC请求参数自动映射复杂对象

java - 如何使用apache poi验证java中每个 header 的xlsx文件 header 名称和列值?

java - Spring Autowiring 实现类

java - Spring Converter 复杂对象

java - BeanFactoryPostProcessor修改实际的bean定义而不是实例?

java - @RequestBody 返回的 Marshall 对象

java - 如果 Couchbase 连接失败,如何在运行时禁用缓存?

css - 为动态复选框放置适当的 CSS - Spring MVC