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 ...
随机推荐
- WebView入门
webview是Android展示网页信息的控件,本文就来简要讲解这个控件的用法.关于webview我找到了一些很不错的文章,我就直接贴上连接,自己就不重复造轮子了.本文仅写出我本人目前使用过的东西, ...
- [Hook] 跨进程 Binder设计与实现 - 设计篇
cp from : http://blog.csdn.net/universus/article/details/6211589 关键词 Binder Android IPC Linux 内核 驱动 ...
- Asp.Net 拦截请求自定义处理
需求: 在Aps.Net 应用中,对于浏览器请求的部分url的地址自定义处理,不交给路由系统或页面. 解决方案: 在全局文件Global.asax中 ,提供Application_BeginReque ...
- UrlRewriter && IIS7
为了在动态网站获得更好的url体验,往往采用url重写技术. 比如:http://blog.xujif.com/?p=268 可以重写为 http://blog.xujif.com/archives/ ...
- 奇怪吸引子---Finance
奇怪吸引子是混沌学的重要组成理论,用于演化过程的终极状态,具有如下特征:终极性.稳定性.吸引性.吸引子是一个数学概念,描写运动的收敛类型.它是指这样的一个集合,当时间趋于无穷大时,在任何一个有界集上出 ...
- Mockito 的使用
转自:Mockito 中文文档 ( 2.0.26 beta ) 转自:手把手教你 Mockito 的使用 参数匹配器 Argument Matcher(参数匹配器) Mockito通过equals() ...
- AD各种布线方法总结
1.常规布线:不详细说了,是个人就知道怎么弄.需要说明的是在布线过程中,可按小键盘的*键或大键盘的数字2键添加一个过孔:按L键可以切换布线层:按数字3可设定最小线宽.典型线宽.最大线宽的值进行切换. ...
- [leetcode]Recover Binary Search Tree @ Python
原题地址:https://oj.leetcode.com/problems/recover-binary-search-tree/ 题意: Two elements of a binary searc ...
- ScaleIO 1.32现在可以免费下载安装使用了(除生产环境之外)
EMC World 2015会上宣布, ScaleIO 1.32可以免费下载使用在非生产环境上了. 这个可以免费下载的版本叫做Free and Drictionless (F&F) downl ...
- 混合开发 Hybird Ionic Angular Cordova web 跨平台 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...