Spring MVC 零配置 / Spring MVC JavaConfig
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的更多相关文章
- Spring boot 零配置开发微服务
2018年12月29日星期六 体验Spring boot 零配置开发微服务 1.为什么要用Spring boot? 1.1 简单方便.配置少.整合了大多数框架 1.2 适用于微服务搭建,搭建的微服务 ...
- 8 -- 深入使用Spring -- 2... Spring的“零配置”支持
8.2 Spring的“零配置”支持 Spring支持使用Annotation来代替XML配置文件.
- 用Spring Boot零配置快速创建web项目(1)
一.Spring Boot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人 ...
- Spring 快速开始 配置Spring Framework
[配置Spring Framework] 1.XML配置依赖关系 bean是由Springframework管理,我们自己编写bean,Spring也内建了bean,比如ApplicationCont ...
- 在eclipse中,使用spring tool suite配置spring环境
本人第一次接触spring,在经过一天的努力之后,终于成功配置了spring环境. 使用spring tool suite配置 1.打开eclipse,选择help->Eclipse marke ...
- Spring MVC零配置(全注解)(版本5.0.7)
// 核心配置类 package spittr.config; import org.springframework.web.servlet.support.AbstractAnnotationCon ...
- 8 -- 深入使用Spring -- 4...5 AOP代理:基于注解的“零配置”方式
8.4.5 基于注解的“零配置”方式 AspectJ允许使用注解定义切面.切入点和增强处理,而Spring框架则可识别并根据这些注解来生成AOP代理.Spring只是使用了和AspectJ 5 一样的 ...
- 【学习】Spring 的 AOP :基于Annotation 的“零配置”方式
转自:http://www.cnblogs.com/jbelial/archive/2012/07/20/2539123.html AOP(Aspect Orient Programming ) , ...
- spring boot所有配置
转载 http://blog.csdn.net/lpfsuperman/article/details/78287265 # 日志配置# 日志配置文件的位置. 例如对于Logback的`classpa ...
随机推荐
- Toast的用法(可以设置显示时间,自定义布局的,线程中的Toast)
自定义的Toast类 布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLa ...
- 关于SqlBulkCopy SQL批量导入需要注意,列名是区分大小写的
最近在做数据从Excel批量导入MSSQL时,传统的是使用Insert Into Table方法,不过这个方便比较慢 通过使用 SqlBulkCopy 可以批量导入到数据库. 默认批量导入数据库,需要 ...
- eclipse 创建聚合maven项目
本人不想花太多时间去排版,所以这里排版假设不好看,请多多包涵! 一直都在用maven,可是却基本没有自己创建过maven项目,今天也试着创建一个. 1.打开eclipse.然后new,other,然后 ...
- JavaScript:Math 对象
ylbtech-JavaScript:Math 对象 Math 对象用于执行数学任务. 使用 Math 的属性和方法的语法: var pi_value=Math.PI; var sqrt_value= ...
- How to delete team project from TFS visual studio ?
/* Author: Jiangong SUN */ To delete team project from TFS Visual Studio, you need to use "TFSD ...
- Tiny210 U-BOOT(二)----配置时钟频率基本原理
U-BOOT在启动的过程中,需要配置系统时钟. 配置系统时钟,大概是以下几个步骤: (1)设置系统PLL锁定时间 (2)配置PLL (3)配置各模块分频系数 (4)切换到PLL时钟 1.基本原理 首先 ...
- HTML JS 数据校验
用到了html字符串校验,这里记录一下. <html> <head> <script type="text/javascript"> funct ...
- iOS开发-Bug锦囊
duplicate symbols for architecture armv7 今天修改了自己项目的部分代码,发现XCode编译的时候报错:duplicate symbols for archite ...
- (十一) 整合spring cloud云架构 - SSO单点登录之OAuth2.0登录流程(2)
上一篇是站在巨人的肩膀上去研究OAuth2.0,也是为了快速帮助大家认识OAuth2.0,闲话少说,我根据框架中OAuth2.0的使用总结,画了一个简单的流程图(根据用户名+密码实现OAuth2.0的 ...
- Android -- DisplayMetrics
干货 DisplayMetrics dm = new DisplayMetrics(); this.getWindowManager().getDefaultDisplay().getMetrics( ...