1. Spring MVC的核心就是DispatcherServlet类,Spring MVC处理请求的流程如下图所示:

2. Spring MVC中典型的上下文层次

当我们初始化一个DispatcherServlet类时,Spring MVC会在web应用的WEB-INF目录下查找一个名字叫:[servlet-name]-servlet.xml的配置文件,查询这个文件中定义的bean并初始化。[servlet-name]-servlet.xml的定义的bean初始化时将会覆盖在全局范围内(global scope)定义的相同名称的bean。我们一般会在web.xml中定义DispatcherServlet。由上图我们可以看出Controller、HandlerMapping、ViewResovler类(和web有关的)在Servlet WebApplicationContext中定义,而Services类,Repositories类(中间服务、数据源等)在Root WebApplicationContext中定义。

3. Spring MVC中单个的根上下文(Single Root Contexct)

如果只有一个单一个根上下文,这样我们就可以定义一个空的contextConfigLocation,因此所有的beans就要在这这个单一的Root Context中定义了。

4. 如何不再要web.xm和[servlet-name].servlet.xml而采用纯粹的java类来实现?

从上图中我们可以看出只要继承了AbstractAnnotationConfigDispatcherServletInitializer类并实现了相关方法即可实现注册一个DispatcherServlet类。

4.1.将 DispatcherServlet 配置在 Servlet 容器中而不再使用 web.xml 。

public class RtpFrontWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    /**
* 指定 Root WebApplicationContext 类,这个类必须@Configuration来注解,从而代替XML配置文件
*/
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{RootConfig.class};
} /**
* 指定 Servlet WebApplicationContext 类,这个类必须@Configuration来注解,从而代替XML配置文件
*/
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{WebConfig.class};
} /**
* 指定 Servlet mappings
*/
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}

 4.2 定义RootConfig类

@Configuration
@ComponentScan(basePackageClasses = Configs.class,
excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.class)})
public class RootConfig {
}

RootConfig类使用了@Configuration作为注解,而@Configuration本身是使用了@Component进行了注解。所以这个RootConfig类是可以被组件扫描到并注入到容器中的。@Configuration用来说明这个是配置类用来替换原来的xml。了实现组件自动扫描和实例化并注入到容器中,我们要在配置类中加上@ComponnetScan注解,并设定扫描的包的范围。本示例扫描的是Configs.class类所在的包。

 4.3 定义WebConfig类

@Configuration
@EnableWebMvc
@ComponentScan(basePackageClasses = HomeController.class)
public class WebConfig {
}

通过@EnableMvc来导入Spring MVC的相关配置,通过@ComponentScan来自动扫描控制器类HomeController所在的包。同样,@Configuration用来说明这个是配置类用来替换原来的xml。

5. 从Servlet容器中(Bean工厂)获取bean.

下面是一个工具类,代码如下:

public class SpringContextUtil {

    /**
* 私有构造函数,不允许实例化
*/
private SpringContextUtil(){
} /**
* Spring应用上下文环境
*/
private static AnnotationConfigWebApplicationContext ctx; static {
ctx = new AnnotationConfigWebApplicationContext();
ctx.register(RootConfig.class);
ctx.refresh();
} /**
* 获取指定Bean的实例
*
* @param name 要获取Bean的名称
* @return Bean object
*/
public static Object getBean(String name) {
return ctx.getBean(name);
}
}

定义了一个工具类来从servlet容器中获取bean。这些bean都是被自动扫描并注入到servlet容器中去的。默认情况下,这个bean的实例都是单例的。获取bean的方法如下:

 AtomTransaction atomTransaction = (AtomTransaction) SpringContextUtil.getBean(getBeanName(transType));

至此,我们已经完成了Spring MVC的零配置实现,主要是用相关的Java类来代替之前的XML文件。

总结:

1、Spring MVC的核心是DispatcherServlet类,它主要实现请求的路由和相关流程的控制;

2、传统DispatcherServlet类的初始化由读取web.xml和[servlet-name]-servlet.xml的相关配置来实现;

3、为什么我们要采用annotation而非xml?基于java的配置,它比基于XML的配置更加强大、类型安全并且易于重构;

4、零配置,其实很简单:继承AbstractAnnotationConfigDispatcherServletInitializer这个抽象类并实现3个相关的抽象方法,3个抽象方法中分别指定:Servlet WebApplicationContext(WebConfig)、Root WebApplicationContext(RootConfig)、Mappings。WebConfig和RootConfig必须要有@Configuration注解和@ComponentScan注解。@Configuration注解用来表明这些是配置类,用来替换XML;@ComponentScan注解用来实现组件或Bean的自动化扫描及在容器中注册(默认为初始化单例)。

5、使用AnnotationConfigWebApplicationContext来从容器中获取Bean,这些Bean默认都是单例的。

帮助到您了吗?

打赏作者(支付宝):

Spring MVC 零配置 / Spring MVC JavaConfig的更多相关文章

  1. Spring boot 零配置开发微服务

    2018年12月29日星期六 体验Spring boot 零配置开发微服务 1.为什么要用Spring  boot? 1.1 简单方便.配置少.整合了大多数框架 1.2 适用于微服务搭建,搭建的微服务 ...

  2. 8 -- 深入使用Spring -- 2... Spring的“零配置”支持

    8.2 Spring的“零配置”支持 Spring支持使用Annotation来代替XML配置文件.

  3. 用Spring Boot零配置快速创建web项目(1)

    一.Spring Boot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人 ...

  4. Spring 快速开始 配置Spring Framework

    [配置Spring Framework] 1.XML配置依赖关系 bean是由Springframework管理,我们自己编写bean,Spring也内建了bean,比如ApplicationCont ...

  5. 在eclipse中,使用spring tool suite配置spring环境

    本人第一次接触spring,在经过一天的努力之后,终于成功配置了spring环境. 使用spring tool suite配置 1.打开eclipse,选择help->Eclipse marke ...

  6. Spring MVC零配置(全注解)(版本5.0.7)

    // 核心配置类 package spittr.config; import org.springframework.web.servlet.support.AbstractAnnotationCon ...

  7. 8 -- 深入使用Spring -- 4...5 AOP代理:基于注解的“零配置”方式

    8.4.5 基于注解的“零配置”方式 AspectJ允许使用注解定义切面.切入点和增强处理,而Spring框架则可识别并根据这些注解来生成AOP代理.Spring只是使用了和AspectJ 5 一样的 ...

  8. 【学习】Spring 的 AOP :基于Annotation 的“零配置”方式

    转自:http://www.cnblogs.com/jbelial/archive/2012/07/20/2539123.html AOP(Aspect Orient Programming ) , ...

  9. spring boot所有配置

    转载 http://blog.csdn.net/lpfsuperman/article/details/78287265 # 日志配置# 日志配置文件的位置. 例如对于Logback的`classpa ...

随机推荐

  1. .NET零基础入门10:打老鼠之数据存储

    一:数据库设计 到此为止,打老鼠游戏还不能保存每次游戏的成绩,我们今天完成的任务就是要存储成绩到SQLSERVER的数据库中. 在上节课中,我们已经知道了如何创建数据库,所有,先创建数据库" ...

  2. Android Studio快捷键之代码提示

    相信很多人在用Eclipse的时候,很习惯的都会把Content Assist设置成.abcd...z,这样每次敲代码的时候都会有自动提示,写起代码来很方便.具体设置如图: 同时,Eclipse中也有 ...

  3. [转]最完美解决Nginx部署ThinkPHP项目的办法

    From : http://www.htmltec.com/archives/302 网上通用解决方法的配置如下: server { location / { index index.htm inde ...

  4. Intelli公司IDE快捷键设置

    自定义快捷键:Keymap 搜索某个像自定义的快捷键,看被占用了没有:搜索时,直接键盘敲击快捷键,比如command+T

  5. MSDN离线版 发现不少人都在找这个

    MSDN离线版 发现不少人都在找这个,无意中找到 VS2012旗舰版 选好语言,建议选那个ISO的下载

  6. matlib实现logistic回归算法(序一)

    数据下载:http://archive.ics.uci.edu/ml/datasets/Adult 数据描述:http://archive.ics.uci.edu/ml/machine-learnin ...

  7. 给Spring的placeholder设置默认值

    问题:使用Spring时,可以方便地通过placeholder的形式${key}将key对应的properities定义value,注入到Bean中.但是如果在properities文件中,没有对ke ...

  8. android 数据加密——加密的概述

    数据加密又称密码学,它是一门历史悠久的技术,指通过加密算法和加密密钥将明文转变为密文,而解密则是通过解密算法和解密密钥将密文恢复为明文.数据加密目前仍是计算机系统对信息进行保护的一种最可靠的办法.它利 ...

  9. laravel 5.5 跨域问题解决方案

    一.laravel-Cors 安装 在终端执行安装命令如下: composer require barryvdh/laravel-cors 添加服务提供商 在Laravel配置文件app.php的pr ...

  10. 转:RNN(Recurrent Neural Networks)

    RNN(Recurrent Neural Networks)公式推导和实现 http://x-algo.cn/index.php/2016/04/25/rnn-recurrent-neural-net ...