在 Spring MVC 的开发中,会在 web.xml 中配置 DispatcherServlet
和 ContextLoaderListener
,对此有一些疑惑。
我是创建了一个 applicationContext.xml
和 spring-mvc.xml
文件。
在 applicationContext.xml
中配置了了 datasource
、transcation
。
在 spring-mvc.xml
中配置了开启 annotation
扫描的一些配置。
那么是否应该这样分模块的进行配置,以及我这样配置是否合理?
再紧接着的又一个问题就是: DispatcherServlet
和 ContextLoaderListener
都会加载配置文件。
- 那么什么样的配置应该在这两者中的哪一个上加载?
- 是否可以不配置
ContextLoaderListener
,而全部用DispatcherServlet
加载? - 这两者加载配置文件又什么区别?
经查询网上大多都是复制粘贴一样的答案,而且含糊不清:
- DispatcherServlet 一般会加载 MVC 相关的 bean 配置管理
- ContextLoaderListener 一般会加载整个 Spring 容器相关的 bean 配置管理
现在我是这样进行配置的:
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext.xml,
</param-value>
</context-param>
这个是spring父子容器的问题吧,SpringMVC的spring-mvc.xml负责@Controller注解的Bean的注册,Spring父容器的applicationContext.xml负责其他非@Controller注解的Bean的注册,可以把全部配置陪在子容器里面.如果把全部Bean在父容器注册,源码里面会导致从子容器中取不到注册的Controller从而找不到Handler,所以访问controller会是404.