1.spring加载-> servletContextListener执行拿到servletContext的init-param = contextConfigLocation参数值,创建 ApplicationContext ioc容器
(原理:利用了servletContext监听器的功能,完成的spring的创建,而且这个监听器是 spring提供好的,你只需要注册完事)
2.springMvc加载-> 注册dispacherServlet创建(initParam = contextCongigLocation)->调用 init()方法(dispacherServlet重写了这个方法)-> 通过servletcofiguration 获取param参数创建 webApplicationContext 子容器rootContext并且 赋值给了disServlet的属性 webApplication让disServlet中含有mvc容器,然后获得 applicationContext父容器 wac,然后执行rootContext.setParent(wac),完成spring和springmvc 父子容器的上下文设置–>spring(applicationContext) 和springmvc(webApplicationContext)容器的 父子关系设置完成,子容器可以用父容器的 组件,但是父容器无法用子容器的组件
(原理:dispacherServlet重写了 init的方法,在这个方法中 获得init-Param参数,完成 WebApplicationContext的创建,以及父子关系设置)
3.springmvc = WebApplcaiton及其创建的组件 + dispacherServlet
4.spring容器(ApplicationContext) 和 springmvc容器(WebApplicaitonContext)的关系图
1.WebApplcaitonContext 包含(可以使用 applcationContext的组件)
->ApplicationContext(无法使用webApplcaitonContext的组件)
实际上就是springmvc容器在创建完成后,将applcationContext做为一个属性值设置在其内部了
2.springmvc的组件 只能 识别 springmvc的组件,例如处理器映射器在找controller的时候
如果这个controller是 spring容器创建的,那么就不能识别,也就不能执行controller
所以,controller必须由 springmvc创建,不能由spring创建,虽然spring创建了,springmvc容器可以获得
controller只能由 mvc创建,不能由spring来创建的原因
1.spring是可以创建 controller的
2.但是,只有 springmvc创建的 controller,才能被springmvc创建的其他组件所识别和调用
3.例如 处理器映射器和处理器适配器,去找controller,必须找 mvc容器中的 controller,如果是 spring容器中的,即使可以获得,但是不能用
4.还有 一种解释,那么就是@ requestMapping注解是 spirngmvc的,但是如果
controller是 spring创建的,那么@requestMapping无法用了....
requestMapper的映射地址,应该也是读取 reqeust中的 地址,然后通过过滤器或拦截器或动态代理来执行的
service,dao组件中 不能添加 controller组件做依赖,因为spring不加载controller,又因为spring是先加载的(监听器相比servlet先执行),所以在加载 service的时候,controller根本都没有,就算spring发现没有beanFactory去getBean,但是spring没有扫描 controller,就没有controller的 definition,无法创建
controller里面可以有 service…组件 因为controller是 mvc创建的,mvc可以用 父容器中的 service组件
为什么要用springmvc
因为,它可以创建 spring创建不了的 web组件