一、Spring Boot介绍

  Spring Boot可以很容易的创建可直接运行的独立的基于Spring的应用程序。

  功能特点:

  • 创建独立的Spring应用程序;
  • 直接嵌入Tomcat、Jetty等Web容器(不需要部署WAR文件);
  • 提供一些“starter(启动器)”依赖关系来简化构建配置;
  • 自动配置Spring和第三方库;
  • 提供可用于生产的功能,如运行状况检查和外部化配置等;
  • 无代码生成和XML配置要求;

二、Spring Boot快速开始

  1、创建一个maven工程

  2、导入Spring Boot相关的jar包

<!--父工程依赖-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/>
</parent> <dependencies>
<!-- web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies> <build>
<finalName>spring-boot-web</finalName>
<plugins>
<!--打包fat jar,引入该插件,可以帮助我们将web应用程序打成可执行jar包-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

  3、编写启动程序

/**
* @desc: spring boot 启动类
* @author: toby
* @date: 2019/7/17 23:03
*/
@SpringBootApplication
public class WebApplication {
public static void main(String[] args) {
SpringApplication.run(WebApplication.class, args);
}
}

  4、自己写的@Controller @Service等注解标示的组件,必须放在启动类(WebApplication)所在的包及其子包下

  5、运行程序

java -jar spring-boot-web.jar

三、Spring Boot初探

  为什么只引入spring-boot-starter-parent和spring-boot-starter-web就可以快速开发web mvc应用?

  1、pom.xml分析

  spring-boot-web的pom.xml如下:

  进去如下spring-boot-starter-parent的pom.xml:

  进去如下spring-boot-dependencies的pom.xml:

  spring-boot-dependencies其实相当于一个对spring-boot所依赖jar包进行版本管理,所有我们导入依赖默认是不需要写版本的!

  2、spring-boot-starter-web为我项目中导入web开发需要的jar包依赖

四、Spring Boot扩展Spring Mvc配置

  1、添加拦截器

  第一步:创建一个拦截器

/**
* @desc: 创建一个拦截器
* @author: toby
*/
@Slf4j
public class TobyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("TobyInterceptor的preHandle方法");
return false;
} @Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("TobyInterceptor的postHandle方法");
} @Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("TobyInterceptor的afterCompletion方法");
}
}

  第二步:注册拦截器

/**
* @desc: WebMvc配置
* @author: toby
*/
@Configuration
public class TobyWebMvcConfig implements WebMvcConfigurer { /**
* 注册拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new TobyInterceptor()).addPathPatterns("/**");
}
}

  2、增加过滤器

  第一步:创建一个过滤器

/**
* @desc: 创建一个过滤器
* @author: toby
*/
@Slf4j
@Component
public class TobyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
log.info("TobyFilter的doFilter方法");
filterChain.doFilter(servletRequest,servletResponse);
}
}

  第二步:注册过滤器

/**
* @desc: WebMvc配置
* @author: toby
*/
@Configuration
public class TobyWebMvcConfig implements WebMvcConfigurer { @Bean
public FilterRegistrationBean<TobyFilter> filterFilterRegistrationBean(TobyFilter tobyFilter){
FilterRegistrationBean<TobyFilter> filterFilterRegistrationBean = new FilterRegistrationBean<>();
List<String> uriList = new ArrayList<>(1);
uriList.add("/**");
filterFilterRegistrationBean.setFilter(tobyFilter);
filterFilterRegistrationBean.setEnabled(true);
filterFilterRegistrationBean.setUrlPatterns(uriList);
filterFilterRegistrationBean.setName("tobyFilter");
filterFilterRegistrationBean.setOrder(1);
return filterFilterRegistrationBean;
}
}

  3、添加Servlet

  第一步:创建一个Servlet

/**
* @desc: 创建一个Servlet
* @author: toby
*/
@Slf4j
@Component
public class TobyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("TobyServlet的doPost方法");
}
}

  第二步:注册Servlet

/**
* @desc: WebMvc配置
* @author: toby
*/
@Configuration
public class TobyWebMvcConfig implements WebMvcConfigurer { /**
* 注册Servlet
* @param tobyFilter
* @return
*/
@Bean
public ServletRegistrationBean servletRegistrationBean(TobyFilter tobyFilter){
return new ServletRegistrationBean(new TobyServlet(), "/servlet");
}
}

  运行结果如下:

  4、如何接管Spring Boot的Mvc配置

  使用@EnableWebMvc注解(不推荐使用

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
//导入了DelegatingWebMvcConfiguration的组件
@Import(DelegatingWebMvcConfiguration.class)
public @interface EnableWebMvc {
}

  ① DelegatingWebMvcConfiguration的继承图

  ② 再看下WebMvc的自动配置类WebMvcAutoConfiguration

@Configuration
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
//容器中没有WebMvcConfigurationSupport该配置文件才生生效,但是我们使用了@EnableWebMvc导入了WebMvcConfiurationSupport,它只保证了Spring Mvc的最基本的功能
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {

  五、总结

  本文主要介绍了Spring Boot的功能特性,如何快速开始一个Spring Boot项目,以及如何扩展Spring Mvc配置,比如如何添加自己的拦截器,过滤器,和Servlet。Spring Boot是微服务的开发利器,所以要对微服务组件有深入了解,Spring Boot的自动装配组件是必备技能。

Spring Boot系列(一):Spring Boot快速开始的更多相关文章

  1. Spring框架系列(2) - Spring简单例子引入Spring要点

    上文中我们简单介绍了Spring和Spring Framework的组件,那么这些Spring Framework组件是如何配合工作的呢?本文主要承接上文,向你展示Spring Framework组件 ...

  2. Spring框架系列(6) - Spring IOC实现原理详解之IOC体系结构设计

    在对IoC有了初步的认知后,我们开始对IOC的实现原理进行深入理解.本文将帮助你站在设计者的角度去看IOC最顶层的结构设计.@pdai Spring框架系列(6) - Spring IOC实现原理详解 ...

  3. Spring框架系列(7) - Spring IOC实现原理详解之IOC初始化流程

    上文,我们看了IOC设计要点和设计结构:紧接着这篇,我们可以看下源码的实现了:Spring如何实现将资源配置(以xml配置为例)通过加载,解析,生成BeanDefination并注册到IoC容器中的. ...

  4. Spring框架系列(8) - Spring IOC实现原理详解之Bean实例化(生命周期,循环依赖等)

    上文,我们看了IOC设计要点和设计结构:以及Spring如何实现将资源配置(以xml配置为例)通过加载,解析,生成BeanDefination并注册到IoC容器中的:容器中存放的是Bean的定义即Be ...

  5. Spring框架系列(9) - Spring AOP实现原理详解之AOP切面的实现

    前文,我们分析了Spring IOC的初始化过程和Bean的生命周期等,而Spring AOP也是基于IOC的Bean加载来实现的.本文主要介绍Spring AOP原理解析的切面实现过程(将切面类的所 ...

  6. Spring框架系列(10) - Spring AOP实现原理详解之AOP代理的创建

    上文我们介绍了Spring AOP原理解析的切面实现过程(将切面类的所有切面方法根据使用的注解生成对应Advice,并将Advice连同切入点匹配器和切面类等信息一并封装到Advisor).本文在此基 ...

  7. Spring框架系列(11) - Spring AOP实现原理详解之Cglib代理实现

    我们在前文中已经介绍了SpringAOP的切面实现和创建动态代理的过程,那么动态代理是如何工作的呢?本文主要介绍Cglib动态代理的案例和SpringAOP实现的原理.@pdai Spring框架系列 ...

  8. Spring框架系列(12) - Spring AOP实现原理详解之JDK代理实现

    上文我们学习了SpringAOP Cglib动态代理的实现,本文主要是SpringAOP JDK动态代理的案例和实现部分.@pdai Spring框架系列(12) - Spring AOP实现原理详解 ...

  9. Spring Boot系列(一) Spring Boot准备知识

    本文是学习 Spring Boot 的一些准备知识. Spring Web MVC Spring Web MVC 的两个Context 如下图所示, 基于 Servlet 的 Spring Web M ...

  10. 【Spring Boot&&Spring Cloud系列】Spring Boot初识

    项目代码地址:https://github.com/AndyFlower/Spring-Boot-Learn/tree/master/Spring-boot-helloworld 一.Spring B ...

随机推荐

  1. jQuery中常用网页效果应用

    一.常用网页效果应用 1.表单应用 表单由表单标签.表单域和表单按钮组成. 1.1单行文本框应用 例:获取和失去焦点改变样式 首先,在网页中创建一个表单,HTML代码如下 <form actio ...

  2. Jarvisoj-web Login

    题目入口: http://web.jarvisoj.com:32772/ 有个登陆框,随便提交参数然后bp抓包 get到了一个Hint,给了sql查询的语句 select * from `admin` ...

  3. 前端学习(八):CSS

    进击のpython ***** 前端学习--CSS 现在的互联网前端分为三层: HTML:超文本标记语言.从语义的角度描述页面结构 CSS:层叠样式表.从审美的角度负责页面样式 JS:Javascri ...

  4. IDEA中项目的两种打包方式

    本文主要介绍在IDEA中怎么打包,及可以用哪种方式打包. 若是有指正或补充的,欢迎留言~  ٩(●̮̃•)۶ 接下来进入正题: IDEA中打包需要先进行配置,so,我们先打开<abbr titl ...

  5. myBatis源码解析-日志篇(1)

    上半年在进行知识储备,下半年争取写一点好的博客来记录自己源码之路.在学习源码的路上也掌握了一些设计模式,可所谓一举两得.本次打算写Mybatis的源码解读. 准备工作 1. 下载mybatis源码 下 ...

  6. Windows下使用图形化mount挂载磁盘到文件夹

    Windows上也有类似于Linux上的mount命令,至于mount是什么: mount是Linux下的一个命令,它可以将分区挂接到Linux的一个文件夹下,从而将分区和该目录联系起来,因此我们只要 ...

  7. 《Python测试开发技术栈—巴哥职场进化记》—初来乍到,请多关照

    上文<巴哥职场进化记-Python测试开发技术栈>开篇讲到巴哥毕业初到深圳,见到了来自五湖四海的室友.一番畅聊之后,抱着对未来职场生活的期待,大家都进入了梦乡.今天我们来看看巴哥第一天上班 ...

  8. 9-Pandas之数据合并与轴向连接(pd.concat()的详解)

    数据合并:由于数据可能是不同的格式,且来自不同的数据源,为了方便之后的处理与加工,需要将不同的数据转换成一个DataFrame. Numpy中的concatenate().vstack().hstac ...

  9. 4.17 斐波那契数列 K维斐波那契数列 矩阵乘法 构造

    一道矩阵乘法的神题 早上的时候我开挂了 想了2h想出来了. 关于这道题我推了很多矩阵 最终推出两个核心矩阵 发现这两个矩阵放在一起做快速幂就行了. 当k==1时 显然的矩阵乘法 多开一个位置维护前缀和 ...

  10. luogu P3409 值日班长值周班长 exgcd

    LINK:值日班长值周班长 题目描述非常垃圾. 题意:一周5天 每周有一个值周班长 每天有一个值日班长 值日班长日换 值周班长周换. 共n个值日班长 m个值周班长 A是第p个值日班长 B是第q个值日班 ...