是这样的,在网上大多数spring和springMVC的整合中,都需要在web.xml里面配置两样东西:1、对spring配置listener,如图:
2、对springMVC配置servlet,如图:
上面这样的配置确实可以运行,我已经测试过。但是,在我公司里面,也采用了spring和springMVC的整合,奇怪的是在web.xml中只看到了对了springMVC的servlet配置,却没有见到对spring的listener的配置,如下图,公司的web.xml配置:web.xml的行数太多,截不完,但是我仔细找过了,确实没有spring的listenner配置!难道spring和springMVC整合后,可以取消掉spring的listener配置吗?需要对公司项目说明的几点:
1、公司项目中spring和springMVC各自配置文件都是采用的注解方式进行配置,即没有applicationContext.xml这类似的配置文件,如下图:
spring的配置类:appConfig.javaspringMVC的配置类:webConfig.javawebConfig.java,是一路一路的继承下来的,反正最终它继承的是WebMvcConfigurerAdapter,如下图:
2、对springMVC配置servlet,如图:
上面这样的配置确实可以运行,我已经测试过。但是,在我公司里面,也采用了spring和springMVC的整合,奇怪的是在web.xml中只看到了对了springMVC的servlet配置,却没有见到对spring的listener的配置,如下图,公司的web.xml配置:web.xml的行数太多,截不完,但是我仔细找过了,确实没有spring的listenner配置!难道spring和springMVC整合后,可以取消掉spring的listener配置吗?需要对公司项目说明的几点:
1、公司项目中spring和springMVC各自配置文件都是采用的注解方式进行配置,即没有applicationContext.xml这类似的配置文件,如下图:
spring的配置类:appConfig.javaspringMVC的配置类:webConfig.javawebConfig.java,是一路一路的继承下来的,反正最终它继承的是WebMvcConfigurerAdapter,如下图:
2. 但是如果用了Shiro 等,Shiro 用到的 Spring 的配置必须在 listener 里加载。
3. 一般 Dao, Service 的 Spring 配置都会在 listener 里加载,因为可能会在多个 Servlet 里用到,因为父子 Context 的可见性问题,防止重复加载所以在 listener 里加载。所以,有时可用可不用,有时必用,具体看情况。
一般配置spring监听器都是为了配合Ioc容器一起使用的。spring源代码里可以看到,启动web服务器的时候会调用监听器的上下文初始化方法,然后去初始化Ioc容器。
朋友,IOC容器是用了的啊,@Bean标签就是把对象放进IOC容器的
1、ClassPathXmlApplicationContext-——从类路径下的XML配置文件中加载上下文定义,把应用上下文定义文件当做类资源;
2、FileSystemXmlapplicationContext——读取文件系统下的XML配置文件并加载上下文定义;
3、XmlWebApplicationContext——读取Web应用下的XML配置文件并装配上下文定义。
Spring MVC采用第三种方式,首先你肯定配置了dispatcher-servlet这个servlet,它会自动加载dispatcher-servlet.xml。如果你只有这一个XML配置文件,那就不用加<listener>那一块的配置。但往往你或许还有个applicationContext.xml,那你就应该加载这个应用上下文(除非你不用他,那你干嘛还要定义他呢?)
那么问题来了,你应该用上面提到的哪种方式的应用上下文呢?(如果用前两种方式,我觉得就不用listener,这个是我臆断的,觉得合理就采纳,也希望大家提出意见)这时候大家往往会选择第三种,在web.xml部署描述符中加载应用上下文。dispatcher-servlet.xml可以自动加载,那么你也想同样的加载applicationContext.xml的话,你就得用listener:
<context-param>
<param-name>contextConfigLocation<param-name>
<param-value>
classpath:application.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
1、不加
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
直接写:
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
这时候程序报错,java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/dispatcher-servlet.xml]说明这里如果不给dispatcher,web.xml会去WEB-INF下找dispatcher-servlet.xml。
这这时候这servlet中加
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:dispatcher-servlet.xml</param-value>
</init-param>
就不报错了,程序可以运行。
由此可以证明,若只有dispatcher-servlet.xml这样的spring配置文件,则不需linstener,因为web.xml中的servlet应该会自己去找,只是在WEB-INF下找。
然后加上classpath:dispatcher-servlet.xml,他就会去classpath下找(classpath的默认路径是什么呀?)
这里 spring 官网