JAVAEE学习五

梳理一下SpringwebMVC的启动流程。

什么是SpringMVC
要回答这个问题,我们先要说说MVC。MVC是一种设计模式,这种设计模式建议将一个请求M(Module)、V(View)、C(controller)三个部分进行处理。请求先经过controller,controller调用其他服务层得到Module,最后将Module数据渲染成试图(View)返回客户端。Spring MVC是Spring生态圈的一个组件,一个遵守MVC设计模式的WEB MVC框架。这个框架可以和Spring无缝整合,上手简单,易于扩展。

解决什么问题
通常我们将一个项目分为WEB层、业务逻辑层和DAO层。Spring MVC解决的是WEB层的编码问题。Spring MVC作为一个框架,抽象了很多通用代码,简化了WEB层的编码,并且支持多种模板技术。我们不需要像以前那样:每个controller都对应编写一个Servlet,请求JSP页面返回给前台。

1.DispatcherServlet

DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring IoC容器无缝集成,从而可以获得Spring的所有好处。

DispatcherServlet ,就是一个servlet,一个用来处理request请求的servlet,它是spring mvc的核心,所有的请求都经过它,并由它指定后续操作该怎么执行,咋一看像一扇门,因此我管它叫“闸门”。在我们继续之前,我们应该共同遵守一个常识,那就是-------无论是监听器还是servlet,都是servlet规范组件,web服务器都可以发现并加载它们。

下面我们先看看 DispatcherServlet 的继承关系:
在这里插入图片描述
看到这我们是不是一目了然了, DispatcherServlet 继承了 HttpServlet 这个类, HttpServlet 是servlet技术规范中专门用于处理http请求的servlet,这就不难解释为什么spring mvc会将 DispatcherServlet 作为统一请求入口了。

因为一个servlet的生命周期是 init() -> service() -> destory() ,那么 DispatcherServlet 怎么初始化呢?看上面的继承图,我们进到 HttpServletBean 去看看。

果不其然, HttpServletBean 类中有一个 init() 方法, HttpServletBean 是一个抽象类, init() 方法如下:
在这里插入图片描述
可以看出方法采用 final 修饰,因为 final 修饰的方法是不能被子类继承的,也就是子类没有同样的 init() 方法了,这个 init 方法就是 DispatcherServlet 的初始化入口了。

接着我们跟进 FrameworkServlet 的 initServletBean() 方法:
在这里插入图片描述
在方法中将会初始化不同于第一小节的web容器,请记住,这个新的spring web 容器是专门为 dispactherServlet 服务的,而且这个新容器是在第一小节根ROOT容器的基础上创建的,我们在 标签中配置的初始化参数被加入到新容器中去。

至此, DispatcherSevlet 的初始化完成了,听着有点蒙蔽,但其实也是这样,上面的分析仅仅只围绕一个方法,它叫 init() ,所有的servlet初始化都将调用该方法。

2.IoC容器

Spring IoC是一个独立的模块,它并不是直接在Web容器中发挥作用的。如果要在Web环境中使用IoC容器,需要Spring为IoC设计一个启动过程,把IoC容器导人,并在Web容器中建立起来。具体说来,这个启动过程是和Web容器的启动过程集成在一起的。在这个过程中,一方面处理Web容器的启动,另一方面通过设计特定的Web容器拦截器,将IoC容器载入到Web环境中来.并将其初始化。在这个过程建立完成以后, IoC容器才能正常工作,而SpringMVC是建立在IoC容器的基础上的,这样才能建立起MVC框架的运行机制,从而响应从Web容器传递的HTTP请求。

IOC容器的启动过程就是建立上下文的过程,该上下文是与SerVietContext相伴而生的,同时也是IoC容器在Web应用环境中的具体表现之一。由ConteztLoaderListener启动的上下文为根上下文。在根上下文的基础上.还有一个与Web MVC相关的上下文用来保存控制器(DispatcherServlet)需要的MVC对象,作为根上下文的子上下文,构成一个层次化的上下文体系。

在Web容器中启动Spring应用程序时.首先建立根上下文.然后建立这个上下文体系的,这个上下文体系的建立是由ContextLoder来完成的。具体如下图:

在这里插入图片描述
在web.xml中,已经配了ContextLoaderListener,这个ConteztLoaderListener提Spring提供的类,是为在Web容器中建立IoC容器服务的。它实现了ServletContextListener接口。这个接口是在Servlet API中定义的,提供了与Servlet生命周期结合的回调,比如contextlnitialized方法和contextDestroyed方法。

而在Web容器中,建立WebApplicationContext的过程,是在contextlnitialized的接口实现中完成的。具体的载入IoC容器的过程是由ContextLoaderListener交由ContextLoader来完成的,而ContextLoader本身就是ContextLoaderListener的基类.它们之间的类关系如下图:
在这里插入图片描述
总之,ContextLoaderListener是SpringMVC的入口,通过父类ContextLoader来实现IoC容器的初始化,通过实现ServletContextListener接口,通过监听来创建或销毁WebApplicationContext(IoC容器)。

3.bean

一、Bean是啥

Java面向对象,对象有方法和属性,那么就需要对象实例来调用方法和属性(即实例化);

凡是有方法或属性的类都需要实例化,这样才能具象化去使用这些方法和属性;

规律:凡是子类及带有方法或属性的类都要加上注册Bean到Spring IoC的注解;

把Bean理解为类的代理或代言人(实际上确实是通过反射、代理来实现的),这样它就能代表类拥有该拥有的东西了

我们都在微博上@过某某,对方会优先看到这条信息,并给你反馈,那么在Spring中,你标识一个@符号,那么Spring就会来看看,并且从这里拿到一个Bean或者给出一个Bean

二、注解分为两类:

A、一类是使用Bean,即是把已经在xml文件中配置好的Bean拿来用,完成属性、方法的组装;比如@Autowired , @Resource,可以通过byTYPE(@Autowired)、byNAME(@Resource)的方式获取Bean;

B、一类是注册Bean,@Component , @Repository , @ Controller , @Service , @Configration这些注解都是把你要实例化的对象转化成一个Bean,放在IoC容器中,等你要用的时候,它会和上面的@Autowired , @Resource配合到一起,把对象、属性、方法完美组装。

三.bean的生成【有xml和组件扫描两种方式】:

例如在spring+springmvc的项目中,往往controller层使用组件扫描,而service层则使用xml配置文件的方式,具体如下:

需求:
在这里插入图片描述
crotroller层:
在这里插入图片描述
service层:
在这里插入图片描述

4.Spring MVC 的启动过程:

首先,对于一个web应用,其部署在web容器中,web容器提供其一个全局的上下文环境,这个上下文就是ServletContext,其为后面的spring IoC容器提供宿主环境;

其次,在web.xml中会提供有ContextLoaderListener。在web容器启动时,会触发容器初始化事件,此时ContextLoaderListener会监听到这个事件,其contextInitialized方法会被调用,在这个方法中,Spring会初始化一个启动上下文,这个上下文被称为根上下文,即WebApplicationContext,这是一个接口类,确切的说,其实际的实现类是XmlWebApplicationContext。这个就是Spring的IoC容器,其对应的Bean定义的配置由web.xml中的context-param标签指定。在这个IoC容器初始化完毕后,Spring以WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE为属性Key,将其存储到ServletContext中,便于获取;

ContextLoaderListener 监听器初始化完毕后,开始初始化web.xml中配置的Servlet,这个servlet可以配置多个,以最常见的DispatcherServlet为例,这个Servlet实际上是一个标准的前端控制器,用以转发、匹配、处理每个servlet请求。DispatcherServlet上下文在初始化的时候会建立自己的IoC上下文,用以持有spring mvc相关的bean。在建立DispatcherServlet自己的IoC上下文时,会利用WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE先从ServletContext中获取之前的 根上下文(即WebApplicationContext)作为自己上下文的parent上下文。有了这个parent上下文之后,再初始化自己持有的上下文。这个DispatcherServlet初始化自己上下文的工作在其initStrategies方法中可以看到,大概的工作就是初始化处理器映射、视图解析等。这个servlet自己持有的上下文默认实现类也是mlWebApplicationContext。初始化完毕后,Spring也将其存到ServletContext中,以便后续使用。这样每个servlet就持有自己的上下文,即拥有自己独立的bean空间,同时各个servlet共享相同的bean。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值