关于Spring与SpringMVC的IOC容器
1.在web.xml中配置Spring的IOC容器
<!--spring配置 — ContextLoaderListener-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-xxx.xml</param-value>
</context-param>
2.在web.xml中配置SpringMVC的IOC容器
<!-- 配置 SpringMVC 的前端控制器 -->
<!-- The front controller of this Spring Web application, responsible for handling all application requests -->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:xxx-mvc.xml</param-value>
</init-param>
<!-- 让DispatcherServlet在Web应用启动时创建对象、初始化 -->
<!-- 默认情况:Servlet在第一次请求的时候创建对象、初始化 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<!-- DispatcherServlet映射的URL地址 -->
<servlet-name>springDispatcherServlet</servlet-name>
<!-- <url-pattern>/</url-pattern>拦截所有请求-->
<!-- 方式二 -->
<url-pattern>*.html</url-pattern>
<url-pattern>*.json</url-pattern>
<url-pattern>*.do</url-pattern>
<!--
优点:伪静态效果,给黑客入侵增加难度、有利于SEO优化
缺点:不符合RESTFUL风格、请求扩展名不匹配时会406错误
-->
</servlet-mapping>
servlet:代表的的容器为spring-mvc的子容器,而DispatcherServlet 是前端控制器,该容器专门为前端监听请求的时候所用,就是说当接收到url请求的时候会引用springmvc容器内的对象来处理。
context-param:代表的容器是spring本身的容器,spring-mvc可以理解为一个继承自该容器的子容器,spring容器是最顶层的父类容器,跟java的继承原理一样,子容器能使用父类的对象,但是父容器不能使用子类的对象。
小知识点:(在项目中使用到两个IOC容器的小问题)
在Spring中引入SpringSecurity框架时,会涉及到一个继承WebSecurityConfigurerAdapter类的类(这个类的主要功能是对资源进行权限限制和权限认证)应注入到Spring的IOC容器中还是SpringMVC的IOC容器中,因为SpringSecurity是对各种url请求进行处理的,所以应当放在SpringMVC容器中。但当web服务启动时,由于引入SpringSecurity框架,服务在启动时 springSecurityFilterChain 要从IOC容器(web服务启动时,首先加载的是Spring的IOC容器)中拿取对应的bean,但是由于这个继承WebSecurityConfigurerAdapter类的类注入在SpringMVC容器中,所以对应于springSecurityFilterChain的bean并不在Spring的IOC容器中,因此会抛出找不到对应bean的异常
解决方案:
1.使项目中只存在一个IOC容器
2.修改源码(源码中只会在Spring的IOC容器中找springSecurityFilterChain对应的bean,这是出现异常的根本原因)
g的IOC容器中找springSecurityFilterChain对应的bean,这是出现异常的根本原因)