Tomcat是如何加载Spring和SpringMVC及Servlet相关知识,以及spring和springmvc的父子关系问题

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组件

综上,disServlet中有 webApplicationContext容器的,而且 AnnotationConfigReactiveWebApplicationContext(创建 webApplcaition容器的),里面有disServlet,因为AnnotationConfigReactiveWebApplicationContext重写了 spring的很多方法,比如onRefresh,但是具体实现是 disServlet里面的方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值