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 ...
随机推荐
- 关于CSS中的float可能出现的小问题
关于CSS中的float可能出现的小问题 前言:最近学习CSS的float所遇到点小问题,然后顺便分享给大家. 一.什么是CSS以及float (一) CSS概述 CSS是层叠样式表(英文全称:Cas ...
- [转]小心PHP的类定义顺序与继承的问题
FROM : http://www.pakey.net/blog/php-class-shunxu.html 以下代码的运行环境均为PHP5.3.11先来看一段代码 <?php class A ...
- Spring Data JPA 实现多表关联查询
本文地址:https://liuyanzhao.com/6978.html 最近抽出时间来做博客,数据库操作使用的是 JPA,相对比 Mybatis 而言,JPA 单表操作非常方便,增删改查都已经写好 ...
- ASP.NET MVC:WebPageBase.cs
ylbtech-funcation-Utility: ASP.NET MVC:WebPageBase.cs 充当表示 ASP.NET Razor 页的类的基类. 1.A,WebPageBase 抽象类 ...
- Ajax 中正常使用jquery-easyui (转)
一.ASP.NET Ajax 页面中应用了 jquery-easyui,当页面进行回发操作后只是局部刷新,原本的EASYUI 样式无法生效.解决这个问题的思路是让页面在回发后重新调用EASYUI进行重 ...
- jquery ajax 的 $.get()用法详解
js文件 $(document).ready(function(){ $("form").submit(function(event) {event.preventDefault( ...
- 如何清空IFRAME中的HTML
window.frames["ifra"].document.write(""); window.frames["ifra"].docume ...
- eclipse如何debug调试jdk源码,并显示局部变量
http://blog.csdn.net/xuefeng0707/article/details/8738869 http://blog.csdn.net/leehsiao/article/detai ...
- getWidth() 和 getMeasuredWidth()的区别
getWidth(): View在设定好布局后整个View的宽度. getMeasuredWidth(): 对View上的内容进行测量后得到的View内容占据的宽度,前提是你必须在父布局的onLa ...
- __attribute__中constructor和destructor[总结]
1.前言 最近看到一份代码,看到一个函数前面用__attribute__((destructor))修饰,当时感觉有点怪怪的,搜了整个程序,也没发现哪个地方调用这个函数.于是从字面意思猜想,该函数会在 ...