【问题标题】:Spring beans are initializing twice in Spring Web applicationSpring bean 在 Spring Web 应用程序中初始化了两次
【发布时间】:2017-07-27 08:12:15
【问题描述】:

我们正在开发 Spring MVC 项目。我们希望在部署 EAR 时初始化所有 bean。以下是我们的 web.xml 文件:

    <servlet>
    <servlet-name>Spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>

    <servlet-mapping>
    <servlet-name>Spring</servlet-name>
    <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>


    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/Spring-servlet.xml</param-value>
    </context-param>

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

下面是我们的 Spring 配置文件:

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

<!-- Switch on the Caching -->
<cache:annotation-driven />

<!-- Do the component scan path -->
<!-- <context:component-scan base-package="caching" /> -->
<bean id="ehcache"
    class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
    p:configLocation="WEB-INF/ehcache.xml" p:shared="true" /> <!-- Why changed to true? https://stackoverflow.com/a/16370326 -->

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"
    p:cacheManager-ref="ehcache" />

<!-- creating datasource -->
<bean id="dataSourceForFilters"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.mariadb.jdbc.Driver" />
    <property name="url" value="jdbc:mariadb://ip:3306/demo" />
    <property name="username" value="remote" />
    <property name="password" value="password" />
</bean>
<bean id="dataSourceForData" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:/misoracle"></property>
</bean>

<!-- creating jdbctemplate and injecting datasource into it -->
<bean id="jdbcTemplateForFilters" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSourceForFilters"></property>
</bean>
<bean id="jdbcTemplateForData" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSourceForData"></property>
</bean>
<!-- end -->

<bean id="applicationContextProvider" class="com.providers.ApplicationContextProvider"></bean>

我们使用组件注解(@Controller、@Service、@Repository)来定义bean。

在将 EAR 部署到服务器时,Beans 正在按照我们的要求正常初始化。

当我们使用诸如“IP:port/context-root/rest”之类的 URL 模式访问应用程序时,Spring bean 再次初始化。

为什么beans再次初始化,有人可以帮忙吗?

【问题讨论】:

  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建最小、完整和可验证的示例。
  • 分享你的 spring-servlet.xml。并分享你的项目目录和错误日志。
  • @KayV 编辑完成
  • 它被加载了两次,因为你告诉它这样做。 ContextLoaderListenerDispatcherservlet 都加载了 spring-servlet.xml,因此所有内容都加载了两次。

标签: java spring spring-mvc spring-bean


【解决方案1】:

你的 web.xml 映射应该是这样的:

<servlet>
    <servlet-name>Spring</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value></param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Spring</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/Spring-servlet.xml</param-value>
</context-param>

【讨论】:

  • 感谢您的回答。请您解释一下它之前是如何工作的以及现在是如何工作的。
猜你喜欢
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 2012-05-03
  • 2013-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多