Spring注解驱动开发第55讲——定制与接管Spring MVC

59 篇文章 131 订阅

写在前面

在前一讲中,我们使用注解的方式(即配置类的方式)来整合了Spring MVC。而在这一讲中,我就来教你如何来定制与接管Spring MVC。

试着回顾一下我们以前整合Spring MVC的开发,是不是应该有一个Spring MVC的配置文件啊?例如mvc.xml,在该配置文件中我们会写非常多的配置,你还记得吧😊!下面我就列举一下该配置文件中的一些常用配置,比如我们经常会写上这样的配置:

<mvc:default-servlet-handler/>

该配置的作用就是将Spring MVC处理不了的请求交给Tomcat服务器,它是专门来针对静态资源的。试想,如果Spring MVC拦截了所有请求,必然地,静态资源也被一起拦截了,那么静态资源就无法访问到了,而写上该配置之后,静态资源就可以被访问到了。

还有,我们还写过这样的配置:

<mvc:annotation-driven />

一般而言,以上配置经常会跟<mvc:default-servlet-handler/>配置成对出现,该配置更多的作用是来开启Spring MVC的高级功能。

还有,我们还配置过拦截器,就像下面这样:

<mvc:interceptors>
    ...
</mvc:interceptors>

此外,我们还有可能配置视图映射,就像下面这样:

<mvc:view-controller path=""/>

也就是说,我们以前会在Spring MVC的配置文件中配置非常多的东西,但是现在没有该配置文件了,那么我们该怎么做到上述的这些事情呢?其实非常简单,只要查看Spring MVC的官方文档就知道了,找到1.11.1. Enable MVC Configuration这一小节,映入眼帘的就是一个@EnableWebMvc注解,如下图所示。

在这里插入图片描述

这告诉我们首先要做的第一件事就是使用@EnableWebMvc注解,它的作用就相当于来启动Spring MVC的自定义配置。

接下来,我就来教大家如何定制与接管Spring MVC。

定制与接管Spring MVC

现在,我们就要开始定制Spring MVC了哟😊,它分为两步,下面我们将会详细介绍这两步。

第一步,首先你得写一个配置类,然后将@EnableWebMvc注解标注在该配置类上。我们就以上一讲中的AppConfig配置类为例,将@EnableWebMvc注解标注在该配置类上,如下所示。

package com.meimeixia.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

// 该配置类相当于Spring MVC的配置文件
// Spring MVC容器只扫描Controller,它是一个子容器
// useDefaultFilters=false:禁用默认的过滤规则
@ComponentScan(value="com.meimeixia",includeFilters={
		@Filter(type=FilterType.ANNOTATION, classes={Controller.class})
},useDefaultFilters=false)
@EnableWebMvc
public class AppConfig {

}

@EnableWebMvc注解的作用就是来开启Spring MVC的定制配置功能。我们查看Spring MVC官方文档中的1.11.1. Enable MVC Configuration这一小节的内容,发现在配置类上标注了@EnableWebMvc注解之后,相当于我们以前在xml配置文件中加上了<mvc:annotation-driven/>这样一个配置,它是来开启Spring MVC的一些高级功能的。

在这里插入图片描述

第二步,配置组件。嘿嘿,咱们要配置的组件还是挺多的,比如视图解析器、视图映射、静态资源映射以及拦截器等等,那这些东东我们要怎么配置呢?其实,还蛮简单的,直接参考Spring MVC的官方文档就哦了。

我们查看一下Spring MVC官方文档中1.11.2. MVC Config API这一小节的内容,发现只须让Java配置类实现WebMvcConfigurer接口,就可以来定制配置。OK,那我们不妨让AppConfig配置类来实现该接口,如下所示。

package com.meimeixia.config;

import java.util.List;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType;
import org.springframework.format.FormatterRegistry;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.stereotype.Controller;
import org.springframework.validation.MessageCodesResolver;
import org.springframework.validation.Validator;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.config.annotation.AsyncSupportConfigurer;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

// 该配置类相当于Spring MVC的配置文件
// Spring MVC容器只扫描Controller,它是一个子容器
// useDefaultFilters=false:禁用默认的过滤规则
@ComponentScan(value="com.meimeixia",includeFilters={
		@Filter(type=FilterType.ANNOTATION, classes={Controller.class})
},useDefaultFilters=false)
@EnableWebMvc
public class AppConfig implements WebMvcConfigurer {

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        // TODO Auto-generated method stub
        configurer.enable()
    }

    // 以下还有非常多的方法,在这里我就不一一写出来了
    // ......

}

唉😥,我们发现这个WebMvcConfigurer接口里面定义了好多的方法啊!真的是好多啊!如下图所示,就问你多不多。

在这里插入图片描述

实现该接口之后,我们就得来实现其里面的每一个方法了,这就是来定制Spring MVC哟😀

来看一下其中的configurePathMatch方法,该方法的作用就是来配置路径映射规则的。

@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
    // TODO Auto-generated method stub
    
}

再来看一下其中的configureAsyncSupport方法,它的作用是来配置是否开启异步支持的。

@Override
public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
    // TODO Auto-generated method stub
    
}

再再来看一下其中的configureDefaultServletHandling方法,它的作用是来配置是否开启静态资源的。我们不妨实现一下该方法,如下所示。

@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    // TODO Auto-generated method stub
    configurer.enable()
}

实现以上方法之后,效果就相当于我们以前在xml配置文件中写上<mvc:default-servlet-handler/>这样一个配置。

继续往下看吧,来看一下其中的addFormatters方法,它的作用是可以来添加一些自定义的类型转换器以及格式化器哟~

@Override
public void addFormatters(FormatterRegistry registry) {
    // TODO Auto-generated method stub
    
}

最后,看一下其中的addInterceptors方法,顾名思义,它是来添加拦截器的。

@Override
public void addInterceptors(InterceptorRegistry registry) {
    // TODO Auto-generated method stub
    
}

后面还有非常多的方法我们就不一一看了,看也看不过来。这时,你会发现配置类只要实现了WebMvcConfigurer接口,那么你就得一个一个来实现其中的方法了,WDNMD,这不麻烦吗?还有没有天理了!

于是,我们就要看看WebMvcConfigurer接口的源码了,如下图所示,我们不妨查看一下该接口的继承树(快捷键Ctrl + T),发现它下面有一个叫WebMvcConfigurerAdapter的适配器。

在这里插入图片描述

我们点进去看一下它的源码,发现它是一个实现了WebMvcConfigurer接口的抽象类,如下图所示。

在这里插入图片描述

该抽象类把WebMvcConfigurer接口中的方法都实现了,只不过每一个方法里面都是空的而已,所以,我们的配置类继承WebMvcConfigurerAdapter抽象类会比较好一点。这是因为如果我们的配置类实现了WebMvcConfigurer接口,那么其中的每一个方法我们都得来具体实现,但是呢,大多数情况下我们并不需要实现这么多方法,再说了,你有那么无聊来实现这么多方法吗?你又不是傻子!

于是,我们就要修改一下AppConfig配置类了,让其继承WebMvcConfigurerAdapter抽象类,如下所示。

package com.meimeixia.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

// 该配置类相当于Spring MVC的配置文件
// Spring MVC容器只扫描Controller,它是一个子容器
// useDefaultFilters=false:禁用默认的过滤规则
@ComponentScan(value="com.meimeixia",includeFilters={
		@Filter(type=FilterType.ANNOTATION, classes={Controller.class})
},useDefaultFilters=false)
@EnableWebMvc
public class AppConfig extends WebMvcConfigurerAdapter {

}

接下来,我们可以来个性化定制Spring MVC了,因为只须复写WebMvcConfigurerAdapter抽象类中的某些方法就行了。这里,我们不妨先来定制一下视图解析器,要想达成这一目的,只须复写WebMvcConfigurerAdapter抽象类中的configureViewResolvers方法哟~

package com.meimeixia.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

// 该配置类相当于Spring MVC的配置文件
// Spring MVC容器只扫描Controller,它是一个子容器
// useDefaultFilters=false:禁用默认的过滤规则
@ComponentScan(value="com.meimeixia",includeFilters={
		@Filter(type=FilterType.ANNOTATION, classes={Controller.class})
},useDefaultFilters=false)
@EnableWebMvc
public class AppConfig extends WebMvcConfigurerAdapter {
	
	// 定制视图解析器
	@Override
	public void configureViewResolvers(ViewResolverRegistry registry) {
		// TODO Auto-generated method stub
		// super.configureViewResolvers(registry); 注释掉这行代码,因为其父类中的方法都是空的
		
		// 如果直接调用jsp方法,那么默认所有的页面都从/WEB-INF/目录下开始找,即找所有的jsp页面
		// registry.jsp();
		
		/*
		 * 当然了,我们也可以自己来编写规则,比如指定一个前缀,即/WEB-INF/views/,再指定一个后缀,即.jsp,
		 * 很显然,此时,所有的jsp页面都会存放在/WEB-INF/views/目录下,自然地,程序就会去/WEB-INF/views/目录下面查找jsp页面了
		 */
		registry.jsp("/WEB-INF/views/", ".jsp");
	}
	
}

为了达到测试的目的,我们在项目的webapp目录下新建一个WEB-INF/views目录,该目录是专门用于存放jsp页面的,然后再在WEB-INF/views目录新建一个jsp页面,例如success.jsp,其内容如下所示。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>success!</h1>
</body>
</html>

接着,我们在HelloController中新增一个如下success方法,以便来处理suc请求。

package com.meimeixia.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.meimeixia.service.HelloService;

@Controller
public class HelloController {
	
	@Autowired
	HelloService helloService;

	@ResponseBody
	@RequestMapping("/hello")
	public String hello() {
		String hello = helloService.sayHello("tomcat...");
		return hello;
	}

	// 处理suc请求
	@RequestMapping("/suc")
	public String success() {
		// 这儿直接返回"success",那么它就会跟我们视图解析器中指定的那个前后缀进行拼串,来到指定的页面
		return "success";
	}
	
}

当客户端发送过来一个suc请求,那么HelloController中的以上success方法就会来处理这个请求。由于该方法直接返回了一个success字符串,所以该字符串就会跟我们视图解析器中指定的那个前后缀进行拼串,并最终来到所指定的页面。

说人话就是,只要客户端发送过来一个suc请求,那么服务端就会响应/WEB-INF/views/目录下的success.jsp页面给客户端。

OK,我们启动项目,启动成功之后,在浏览器地址栏中输入http://localhost:8080/springmvc-annotation-liayun/suc进行访问,效果如下图所示。

在这里插入图片描述

这说明我们已经成功定制了视图解析器,因为定制的视图解析器起效果了。

然后,我们来定制一下静态资源的访问。假设我们项目的webapp目录下有一些静态资源,比如有一张图片,名字就叫test.jpg,打开发现它是一张美女图片。

在这里插入图片描述

此时,我们在项目的webapp目录下新建一个jsp页面,例如index.jsp,很显然,该页面是项目的首页,随即我们在首页中使用一个<img>标签来引入上面那张美女图片,即在页面中引入静态资源。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<img alt="" src="test.jpg">
</body>
</html>

此时,在浏览器中访问项目的首页,你会发现上面那张美女图片压根就显示不出来,与此同时,Eclipse控制台会打印如下这样一个警告。

在这里插入图片描述

为什么会报以上这样一个警告呢?这是因为请求被Spring MVC拦截处理了,这样,它就得要找@RequestMapping注解中写的映射了,但是实际上呢,test.jpg是一个静态资源,它得交给Tomcat服务器去处理,因此,我们就得来定制静态资源的访问了。

要想达成这一目的,我们只须复写WebMvcConfigurerAdapter抽象类中的configureDefaultServletHandling方法就可以了。

package com.meimeixia.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

// 该配置类相当于Spring MVC的配置文件
// Spring MVC容器只扫描Controller,它是一个子容器
// useDefaultFilters=false:禁用默认的过滤规则
@ComponentScan(value="com.meimeixia",includeFilters={
		@Filter(type=FilterType.ANNOTATION, classes={Controller.class})
},useDefaultFilters=false)
@EnableWebMvc
public class AppConfig extends WebMvcConfigurerAdapter {
	
	// 定制视图解析器
	@Override
	public void configureViewResolvers(ViewResolverRegistry registry) {
		// TODO Auto-generated method stub
		// super.configureViewResolvers(registry); 注释掉这行代码,因为其父类中的方法都是空的
		
		// 如果直接调用jsp方法,那么默认所有的页面都从/WEB-INF/目录下开始找,即找所有的jsp页面
		// registry.jsp();
		
		/*
		 * 当然了,我们也可以自己来编写规则,比如指定一个前缀,即/WEB-INF/views/,再指定一个后缀,即.jsp,
		 * 很显然,此时,所有的jsp页面都会存放在/WEB-INF/views/目录下,自然地,程序就会去/WEB-INF/views/目录下面查找jsp页面了
		 */
		registry.jsp("/WEB-INF/views/", ".jsp");
	}
	
	// 定制静态资源的访问
	@Override
	public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
		configurer.enable();
	}
	
}

在以上configureDefaultServletHandling方法中调用configurer.enable(),其实就相当于我们以前在xml配置文件中写上<mvc:default-servlet-handler/>这样一个配置。

此时,我们重启项目,成功之后,再次来访问项目的首页,发现那张美女图片终于在浏览器页面中显示出来了,效果如下。

在这里插入图片描述

OK,静态资源就能访问了,完美😂

接着,我就来教大家如何定制拦截器,这还是稍微有点复杂的,你可要看仔细了哟😊!

先编写一个拦截器,例如MyFirstInterceptor,要知道一个类要想成为拦截器,那么它必须得实现Spring MVC提供的HandlerInterceptor接口,如下所示。

package com.meimeixia.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class MyFirstInterceptor implements HandlerInterceptor {

	// 在页面响应以后执行
	@Override
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		// TODO Auto-generated method stub
		System.out.println("afterCompletion...");
	}

	// 在目标方法运行正确以后执行
	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {
		// TODO Auto-generated method stub
		System.out.println("postHandle...");
	}

	// 在目标方法运行之前执行
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse arg1, Object arg2) throws Exception {
		// TODO Auto-generated method stub
		System.out.println("preHandle...");
		return true; // 返回true,表示放行(目标方法)
	}

}

编写好以上拦截器之后,如果要是搁以前,那么我们就得在xml配置文件里面像下面这样配置该拦截器。

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="com.meimeixia.controller.MyFirstInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

而现在我们只须复写WebMvcConfigurerAdapter抽象类中的addInterceptors方法就行了,就像下面这样。

package com.meimeixia.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import com.meimeixia.controller.MyFirstInterceptor;

// 该配置类相当于Spring MVC的配置文件
// Spring MVC容器只扫描Controller,它是一个子容器
// useDefaultFilters=false:禁用默认的过滤规则
@ComponentScan(value="com.meimeixia",includeFilters={
		@Filter(type=FilterType.ANNOTATION, classes={Controller.class})
},useDefaultFilters=false)
@EnableWebMvc
public class AppConfig extends WebMvcConfigurerAdapter {
	
	// 定制视图解析器
	@Override
	public void configureViewResolvers(ViewResolverRegistry registry) {
		// TODO Auto-generated method stub
		// super.configureViewResolvers(registry); 注释掉这行代码,因为其父类中的方法都是空的
		
		// 如果直接调用jsp方法,那么默认所有的页面都从/WEB-INF/目录下开始找,即找所有的jsp页面
		// registry.jsp();
		
		/*
		 * 当然了,我们也可以自己来编写规则,比如指定一个前缀,即/WEB-INF/views/,再指定一个后缀,即.jsp,
		 * 很显然,此时,所有的jsp页面都会存放在/WEB-INF/views/目录下,自然地,程序就会去/WEB-INF/views/目录下面查找jsp页面了
		 */
		registry.jsp("/WEB-INF/views/", ".jsp");
	}
	
	// 定制静态资源的访问
	@Override
	public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
		configurer.enable();
	}
	
	// 定制拦截器
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		// TODO Auto-generated method stub
		// super.addInterceptors(registry);
		
		/*
		 * addInterceptor方法里面要传一个拦截器对象,该拦截器对象可以从容器中获取过来,也可以我们自己来new一个,
		 * 很显然,这儿我们是new了一个我们自定义的拦截器对象。
		 * 
		 * 虽然创建出了一个拦截器,但是最关键的一点还是指示拦截器要拦截哪些请求,因此还得继续使用addPathPatterns方法来配置一下,
		 * 若在addPathPatterns方法中传入了"/**",则表示拦截器会拦截任意请求,而不管该请求是不是有任意多层路径
		 */
		registry.addInterceptor(new MyFirstInterceptor()).addPathPatterns("/**");
	}
	
}

OK,我们来看一下以上定制的拦截器能不能生效。重启项目,项目启动成功之后,在浏览器地址栏中输入http://localhost:8080/springmvc-annotation-liayun/suc进行访问,即访问suc请求,发现Eclipse控制台打印出了如下内容。

在这里插入图片描述

这依然说明咱们定制的拦截器生效了。

那么,剩余其他的对Spring MVC的个性化定制,相信你应该都会了吧!不就是照葫芦画瓢嘛,很简单的,而且你还可以参考Spring MVC的官方文档哟😁,比方说你要定制类型转换器,那么可以参考Spring MVC官方文档中的1.11.3. Type Conversion这一小节中的内容,主要是参考Java代码。

在这里插入图片描述

所以,大家有事没事都常看看人家官方写的文档,你看人家写得多清楚,多简洁明了啊!在每一小节中,上面都会先用一段Java代码告诉你应该复写哪个方法,下面则会告诉你复写之后相当于我们以前在xml配置文件中写的什么样的配置。

最后,我们总结一下,如果我们想要个性化定制Spring MVC,那么只须编写一个配置类来继承WebMvcConfigurerAdapter抽象类就行了,当然,前提是该配置类上得有@EnableWebMvc注解。这就是个性化定制Spring MVC的规则。

  • 2
    点赞
  • 1
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
在当今Java EE 开发中,Spring 框架是当之无愧的王者。而Spring Boot 是Spring 主推的基于“习惯优于配置”的原则,让你能够快速搭建应用的框架,从而使得Java EE 开发变得异常简单。 《JavaEE开发的颠覆者: Spring Boot实战》从Spring 基础、Spring MVC 基础起,从而无难度地引入Spring Boot 的学习。涵盖使用Spring Boot 进行Java EE 开发的绝大数应用场景,包含:Web 开发、数据访问、安全控制、批处理、异步消息、系统集成、开发与部署、应用监控、分布式系统开发等。 第一部分 点睛Spring 4.x 第1 章 Spring 基础 2 1.1 Spring 概述 2 1.1.1 Spring 的简史 2 1.1.2 Spring 概述 3 1.2 Spring 项目快速搭建 5 1.2.1 Maven 简介 6 1.2.2 Maven 安装 6 1.2.3 Maven 的pom.xml 7 1.2.4 Spring 项目的搭建 9 1.3 Spring 基础配置 17 1.3.1 依赖注入 18 1.3.2 Java 配置 21 1.3.3 AOP 24 第2 章 Spring 常用配置 30 2.1 Bean 的Scope 30 2.1.1 点睛 30 2.1.2 示例 31 2.2 Spring EL 和资源调用. 33 2.2.1 点睛 33 2.2.2 示例 33 2.3 Bean 的初始化和销毁 37 2.3.1 点睛 37 2.3.2 演示 38 2.4 Profile 40 2.4.1 点睛 40 2.4.2 演示 41 2.5 事件(Application Event) 44 2.5.1 点睛 44 2.5.2 示例 44 第3 章 Spring 高级话题 48 3.1 Spring Aware 48 3.1.1 点睛 48 3.1.2 示例 49 3.2 多线程 51 3.2.1 点睛 51 3.2.2 示例 51 3.3 计划任务 54 3.3.1 点睛 54 3.3.2 示例 54 3.4 条件注解@Conditional 56 3.4.1 点睛 56 3.4.2 示例 57 3.5 组合注解与元注解 60 3.5.1 点睛 60 3.5.2 示例 60 3.6 @Enable*注解的工作原理 63 3.6.1 第一类:直接导入配置类 63 3.6.2 第二类:依据条件选择配置类 64 3.6.3 第三类:动态注册Bean 65 3.7 测试 66 3.7.1 点睛 66 3.7.2 示例 67 第二部分 点睛Spring MVC 4.x 第4 章 Spring MVC 基础 72 4.1 Spring MVC 概述 73 4.2 Spring MVC 项目快速搭建 74 4.2.1 点睛 74 4.2.2 示例 74 4.3 Spring MVC 的常用注解 82 4.3.1 点睛 82 4.3.2 示例 83 4.4 Spring MVC 基本配置 87 4.4.1 静态资源映射 88 4.4.2 拦截器配置 89 4.4.3 @ControllerAdvice 91 4.4.4 其他配置 94 4.5 Spring MVC 的高级配置 98 4.5.1 文件上传配置 98 4.5.2 自定义HttpMessageConverter 101 4.5.3 服务器端推送技术 106 4.6 Spring MVC 的测试 113 4.6.1 点睛 113 4.6.2 示例 114 第三部分 实战Spring Boot 第5 章 Spring Boot 基础 122 5.1 Spring Boot 概述 122 5.1.1 什么是Spring Boot 122 5.1.2 Spring Boot 核心功能 122 5.1.3 Spring Boot 的优缺点 124 5.1.4 关于本书的Spring Boot 版本 124 5.2 Spring Boot 快速搭建 124 5.2.1 http://start.spring.io 124 5.2.2 Spring Tool Suite 127 5.2.3 IntelliJ IDEA 129 5.2.4 Spring Boot CLI 132 5.2.5 Maven 手工构建 134 5.2.6 简单演示 136 第6 章 Spring Boot 核心 138 6.1 基本配置 138 6.1.1 入口类和@SpringBootApplication 138 6.1.2 关闭特定的自动配置 139 6.1.3 定制Banner 139 6.1.4 Spring Boot 的配置文件 140 6.1.5 starter pom 141 6.1.6 使用xml 配置 143 6.2 外部配置 143 6.2.1 命令行参数配置 143 6.2.2 常规属性配置 144 6.2.3 类型安全的配置(基于properties) 145 6.3 日志配置 148 6.4 Profile 配置 148 实战 148 6.5 Spring Boot 运行原理 150 6.5.1 运作原理 153 6.5.2 核心注解 154 6.5.3 实例分析 157 6.5.4 实战 160 第7 章 Spring Boot 的Web 开发 170 7.1 Spring Boot 的Web 开发支持 170 7.2 Thymeleaf 模板引擎 171 7.2.1 Thymeleaf 基础知识 171 7.2.2 与Spring MVC 集成 174 7.2.3 Spring Boot 的Thymeleaf 支持 175 7.2.4 实战 177 7.3 Web 相关配置 182 7.3.1 Spring Boot 提供的自动配置 182 7.3.2 接管Spring Boot 的Web 配置 185 7.3.3 注册Servlet、Filter、Listener 186 7.4 Tomcat 配置 187 7.4.1 配置Tomcat 187 7.4.2 代码配置Tomcat 188 7.4.3 替换Tomcat 190 7.4.4 SSL 配置 191 7.5 Favicon 配置 196 7.5.1 默认的Favicon 196 7.5.2 关闭Favicon 196 7.5.3 设置自己的Favicon 197 7.6 WebSocket 197 7.6.1 什么是WebSocket 197 7.6.2 Spring Boot 提供的自动配置 197 7.6.3 实战 198 7.7 基于Bootstrap 和AngularJS 的现代Web 应用 212 7.7.1 Bootstrap 213 7.7.2 AngularJS 216 7.7.3 实战 222 第8 章 Spring Boot 的数据访问 233 8.1 引入Docker 237 8.1.1 Docker 的安装 238 8.1.2 Docker 常用命令及参数 242 8.1.3 下载本书所需的Docker 镜像 247 8.1.4 异常处理 247 8.2 Spring Data JPA 248 8.2.1 点睛Spring Data JPA 248 8.2.2 Spring Boot 的支持 258 8.2.3 实战 260 8.3 Spring Data REST 284 8.3.1 点睛Spring Data REST 284 8.3.2 Spring Boot 的支持 285 8.3.3 实战 286 8.4 声名式事务 297 8.4.1 Spring 的事务机制 297 8.4.2 声名式事务 298 8.4.3 注解事务行为 299 8.4.4 类级别使用@Transactional 300 8.4.5 Spring Data JPA 的事务支持 300 8.4.6 Spring Boot 的事务支持 302 8.4.7 实战 303 8.5 数据缓存Cache 309 8.5.1 Spring 缓存支持 309 8.5.2 Spring Boot 的支持 310 8.5.3 实战 312 8.5.4 切换缓存技术 319 8.6 非关系型数据库NoSQL 320 8.6.1 MongoDB 320 8.6.2 Redis 329 第9 章 Spring Boot 企业级开发 340 9.1 安全控制Spring Security 340 9.1.1 Spring Security 快速入门 340 9.1.2 Spring Boot 的支持 347 9.1.3 实战 348 9.2 批处理Spring Batch 362 9.2.1 Spring Batch 快速入门 362 9.2.2 Spring Boot 的支持 370 9.2.3 实战 371 9.3 异步消息 385 9.3.1 企业级消息代理 386 9.3.2 Spring 的支持 386 9.3.3 Spring Boot 的支持 386 9.3.4 JMS 实战 387 9.3.5 AMQP 实战 391 9.4 系统集成Spring Integration 395 9.4.1 Spring Integration 快速入门 395 9.4.2 Message 395 9.4.3 Channel 395 9.4.4 Message EndPoint 398 9.4.5 Spring Integration Java DSL 400 9.4.6 实战 400 第10 章 Spring Boot 开发部署与测试 407 10.1 开发的热部署 407 10.1.1 模板热部署 407 10.1.2 Spring Loaded 407 10.1.3 JRebel 409 10.1.4 spring-boot-devtools 413 10.2 常规部署 413 10.2.1 jar 形式 413 10.2.2 war 形式 417 10.3 云部署——基于Docker 的部署 419 10.3.1 Dockerfile 419 10.3.2 安装Docker 421 10.3.3 项目目录及文件 421 10.3.4 编译镜像 423 10.3.5 运行 424 10.4 Spring Boot 的测试 424 10.4.1 新建Spring Boot 项目 425 10.4.2 业务代码 425 10.4.3 测试用例 427 10.4.4 执行测试 429 第11 章 应用监控 431 11.1 http 431 11.1.1 新建Spring Boot 项目 432 11.1.2 测试端点 432 11.1.3 定制端点 439 11.1.4 自定义端点 440 11.1.5 自定义HealthIndicator 444 11.2 JMX 447 11.3 SSH 449 11.3.1 新建Spring Boot 项目 449 11.3.2 运行 449 11.3.3 常用命令 451 11.3.4 定制登录用户 452 11.3.5 扩展命令 452 第12 章 分布式系统开发 456 12.1 微服务、原生云应用 456 12.2 Spring Cloud 快速入门 457 12.2.1 配置服务 457 12.2.2 服务发现 457 12.2.3 路由网关 457 12.2.4 负载均衡 457 12.2.5 断路器 458 12.3 实战 458 12.3.1 项目构建 458 12.3.2 服务发现——Discovery(Eureka Server) 459 12.3.3 配置——Config(Config Server) 461 12.3.4 服务模块——Person 服务 463 12.3.5 服务模块——Some 服务 466 12.3.6 界面模块——UI(Ribbon,Feign) 468 12.3.7 断路器监控——Monitor(DashBoard) 473 12.3.8 运行 474 12.4 基于Docker 部署 478 12.4.1 Dockerfile 编写 478 12.4.2 Docker Compose 480 12.4.3 Docker-compose.yml 编写 481 12.4.4 运行 483 附录A 485 A.1 基于JHipster 的代码生成 485 A.2 常用应用属性配置列表 488
相关推荐
©️2020 CSDN 皮肤主题: 猿与汪的秘密 设计师:白松林 返回首页

打赏

李阿昀

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值