Spring- MVC web. xml файл не использует ContextLoaderListener - PullRequest
0 голосов
/ 29 февраля 2020

Я понимаю, для чего предназначены ContextLoaderListener и DispatcherServlet.

Что я не понимаю, так это почему мое приложение Sprin- MVC запустится, если я НЕ определю класс ContextLoaderListener в сети. xml file.

Я ожидаю увидеть сообщение об отсутствии контекста или что-то подобное.

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

Web. xml

<display-name>Camel Routes</display-name>

<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

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

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

диспетчер-сервлет. xml

<aop:aspectj-autoproxy/>

<context:component-scan base-package="com.crmProject"/>

<mvc:annotation-driven/>

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/"/>
    <property name="suffix" value=".jsp"/>
</bean>

<bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
      destroy-method="close">
    <property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
    <property name="jdbcUrl" value="jdbc:mysql://mysql:3306/web_customer_tracker"/>
    <property name="user" value="root"/>
    <property name="password" value="root"/>

    <property name="initialPoolSize" value="5"/>
    <property name="minPoolSize" value="5"/>
    <property name="maxPoolSize" value="20"/>
    <property name="maxIdleTime" value="30000"/>
</bean>

<bean id="sessionFactory"
      class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <property name="dataSource" ref="myDataSource"/>

    <property name="packagesToScan" value="com.crmProject.entity"/>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
</bean>

<bean id="myTransactionManager"
      class="org.springframework.orm.hibernate5.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

<tx:annotation-driven transaction-manager="myTransactionManager"/>

<mvc:resources location="/resources/" mapping="/resources/**"/>

Ответы [ 2 ]

0 голосов
/ 29 февраля 2020

Прежде всего: контекст, загружаемый DispatcherServlet, и контекст, загружаемый ContextLoaderListener, - это два разных контекста.

DispatcherServlet загружает свой контекст самостоятельно. По умолчанию он ищет файл конфигурации, используя шаблон [servletName]-servlet.xml. Так что для DispatcherServlet с именем dispatcher это будет dispatcher-servlet.xml. Но вы можете указать собственное имя файла, используя contextConfigLocation параметр сервлета:

<servlet>
   <servlet-name>dispatcher</servlet-name>
   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
   <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:custom-name-servlet.xml</param-value>
   </init-param>
   <load-on-startup>1</load-on-startup>
</servlet>

В вашем приложении может быть несколько экземпляров DispatcherServlet. Каждый экземпляр представляет отдельное приложение MVC. И каждый экземпляр имеет свой собственный изолированный контекст. DispatcherServlet экземпляры не могут получить доступ к контекстам друг друга.

ContextLoaderListener загружает так называемый root контекст. Вы можете иметь только один root контекст в вашем приложении (или не иметь его вообще). И каждый экземпляр DispatcherServlet имеет доступ к этому контексту. Таким образом, вы можете рассматривать этот контекст как родительский контекст, в то время как контекст DispatcherServlet является дочерним контекстом. Каждый раз, когда вашему приложению требуется получить экземпляр компонента, он сначала будет искать компонент в дочернем контексте. Если приложение не находит бин в дочернем контексте, оно начинает искать в root контексте.

Более подробную информацию вы можете найти в документации Spring. Глава Контекстная иерархия .

0 голосов
/ 29 февраля 2020

Поскольку ваши определения контекста кажутся очень традиционными и полными, вам не нужен ContextLoaderListener. Spring может обрабатывать все ваши конфигурации из коробки.

ContextLoaderListener вступает в игру, если у вас есть какие-то странные потребности инициализации, которые не могут быть решены весной. Реализуйте свой собственный потомок ContextLoaderListener и настройте его (либо в файле xml, либо с помощью аннотации). Ваша реализация может делать все, что нужно (например, извлекать конфигурации из нестандартного источника, чтобы вставить его в контекст Spring).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...