SpringBoot系列

2020-03-16 19:35:50 浏览数 (1)


Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。

-----------------来自小马哥的故事


SpringBoot系列-1入门

相关介绍

官网:https://projects.spring.io/spring-boot

官方应用: SpringBoot->SpringCloud>微服务

Spring Boot不是一门新技术。从本质上来说,Spring Boot就是Spring,它做了那些没有它你也会去做的Spring Bean配置。它使用“习惯优于配置”(项目中存在大量的配置,此外还内置了一个习惯性的配置,让你无需手动进行配置)的理念让你的项目快速运行起来。使用Spring Boot很容易创建一个独立运行(运行jar,内嵌Servlet容器)、准生产级别的基于Spring框架的项目,使用Spring Boot基本上可以不用或者只需要很少的Spring配置

SpringBoot精要

SpringBoot是伴随着Spring4.0诞生的

SpringBoot帮助开发者快速启动一个Web容器

SpringBoot继承了原有Spring框架的优秀基因

SpringBoot简化了使用Spring的过程

自动配置:针对很多Spring应用程序常见的应用功能,Spring Boot能自动提供相关配置

起步依赖:告诉Spring Boot需要什么功能,它就能引入需要的库。

命令行界面:这是Spring Boot的可选特性,借此你只需写代码就能完成完整的应用程序,无需传统项目构建。

Actuator:让你能够深入运行中的Spring Boot应用程序,探测各种指标。

springboot使开发更简单

springboot使配置更简单

功能的组合配置:

代码语言:javascript复制
从XML config -> Java config
Bean  注入   ->  Autowire

部署环境配置:

代码语言:javascript复制
从多个 *peoperties  -> 单个 Application.yml(或者properties)

springboot使监控更简单:

代码语言:javascript复制
spring-boot-actuator:

/configpros            查看属性配置
/dump                    线程工作状态
/env/{name}           环境变量
/metrics/{name}     JVM性能指标
/mappings       RestFul Path 与服务类的映射关系

springboot使服务化开发更简单:

多个client >>> 通过Api接口 <<< Rest API>>> 多个Springboot SPI

系统要求

目前Spring Boot最新正式版为1.5.8.RELEASE

默认情况下,Spring Boot 1.5.X.RELEASE需要Java 7和Spring Framework 4.3以上或更高版本,我们可以使用Spring Boot with Java 6和一些额外的配置(不建议),使用Maven(3.2 )或Gradle 2(2.9或更高版本)和3来构建。

大家可以使用Java 6或7的Spring Boot,通常推荐Java 8。 本次统一使用Java 1.8,Spring Boot 1.5.1.RELEASE以及Maven3.3.9版本。开发工具使用STS

快速入门

传统Spring MVC开发一个简单的Hello World Web应用程序,你应该做什么?

一个项目结构,其中有一个包含必要依赖的Maven或者Gradle构建文件,最起码要有Spring MVC和Servlet API这些依赖。

一个web.xml文件(或者一个WebApplicationInitializer实现),其中声明了Spring的DispatcherServlet。

一个启动了Spring MVC的Spring配置

一控制器类,以“hello World”相应HTTP请求。

一个用于部署应用程序的Web应用服务器,比如Tomcat。

最让人难以接受的是,这份清单里面只有一个东西是和Hello World功能相关的,即控制器,剩下的都是Spring开发的Web应用程序必需的通用模板。

接下来看看Spring Boot如何搞定? 很简单,我仅仅只需要非常少的几个配置就可以迅速方便的搭建起来一套web项目

SpringBoot系列-2配置

Spring Boot使用了一个全局的配置文件application.properties,放在src/main/resources目录下或者类路径的/config下。Sping Boot的全局配置文件的作用是对一些默认配置的配置值进行修改。

1、自定义属性

2、参数引用

3、引用自定义配置文件

4、配置随机值

5、内置属性配置

配置文件加载优先级

application.properties和application.yml文件可以放在一下四个位置:

外置:在相对于应用程序运行目录的/congfig子目录里。

外置:在应用程序运行的目录里

内置:在config包内

内置:在Classpath根目录

同样,这个列表按照优先级排序,也就是说,src/main/resources/config下application.properties覆盖src/main/resources下application.properties中相同的属性

如果你在相同优先级位置同时有application.properties和application.yml,那么application.yml里面的属性就会覆盖application.properties里的属性。

Profile-多环境配置

当应用程序需要部署到不同运行环境时,一些配置细节通常会有所不同,最简单的比如日志,生产日志会将日志级别设置为WARN或更高级别,并将日志写入日志文件,而开发的时候需要日志级别为DEBUG,日志输出到控制台即可。

如果按照以前的做法,就是每次发布的时候替换掉配置文件,这样太麻烦了,Spring Boot的Profile就给我们提供了解决方案,命令带上参数就搞定。

在Spring Boot中多环境配置文件名需要满足application-{profile}.properties的格式,其中{profile}对应你的环境标识,比如:

代码语言:javascript复制
application-dev.properties:开发环境
application-prod.properties:生产环境

想要使用对应的环境,只需要在application.properties中使用spring.profiles.active属性来设置,值对应上面提到的{profile},这里就是指dev、prod这2个。

或者用命令行启动的时候带上参数: java -jar xxx.jar --spring.profiles.active=dev

SpringBoot系列-3启动解析

1、@SpringBootApplication 2、SpringBootApplication.run()

SpringBoot执行流程

SpringApplication的run方法的实现程序运行的主要线路,该方法的主要流程大体可以归纳如下:

1) 如果我们使用的是SpringApplication的静态run方法,那么,这个方法里面首先要创建一个SpringApplication对象实例,然后调用这个创建好的SpringApplication的实例方法。在SpringApplication实例初始化的时候,它会提前做几件事情: 根据classpath里面是否存在某个特征类(org.springframework.web.context.ConfigurableWebApplicationContext)来决定是否应该创建一个为Web应用使用的ApplicationContext类型。 使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationContextInitializer。 使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationListener。 推断并设置main方法的定义类。

2) SpringApplication实例初始化完成并且完成设置后,就开始执行run方法的逻辑了,方法执行伊始,首先遍历执行所有通过SpringFactoriesLoader可以查找到并加载的SpringApplicationRunListener。调用它们的started()方法,告诉这些SpringApplicationRunListener,“嘿,SpringBoot应用要开始执行咯!”。

3) 创建并配置当前Spring Boot应用将要使用的Environment(包括配置要使用的PropertySource以及Profile)。

4) 遍历调用所有SpringApplicationRunListener的environmentPrepared()的方法,告诉他们:“当前SpringBoot应用使用的Environment准备好了咯!”。

5) 如果SpringApplication的showBanner属性被设置为true,则打印banner。

6) 根据用户是否明确设置了applicationContextClass类型以及初始化阶段的推断结果,决定该为当前SpringBoot应用创建什么类型的ApplicationContext并创建完成,然后根据条件决定是否添加ShutdownHook,决定是否使用自定义的BeanNameGenerator,决定是否使用自定义的ResourceLoader,当然,最重要的,将之前准备好的Environment设置给创建好的ApplicationContext使用。

7) ApplicationContext创建好之后,SpringApplication会再次借助Spring-FactoriesLoader,查找并加载classpath中所有可用的ApplicationContext-Initializer,然后遍历调用这些ApplicationContextInitializer的initialize(applicationContext)方法来对已经创建好的ApplicationContext进行进一步的处理。

8) 遍历调用所有SpringApplicationRunListener的contextPrepared()方法。

9) 最核心的一步,将之前通过@EnableAutoConfiguration获取的所有配置以及其他形式的IoC容器配置加载到已经准备完毕的ApplicationContext。

10) 遍历调用所有SpringApplicationRunListener的contextLoaded()方法。

11) 调用ApplicationContext的refresh()方法,完成IoC容器可用的最后一道工序。

12) 查找当前ApplicationContext中是否注册有CommandLineRunner,如果有,则遍历执行它们。

13) 正常情况下,遍历执行SpringApplicationRunListener的finished()方法、(如果整个过程出现异常,则依然调用所有SpringApplicationRunListener的finished()方法,只不过这种情况下会将异常信息一并传入处理)

SpringBoot系列-4Web应用

项目结构推荐

root package结构:com.example.demo应用启动类

Application.java置于root package下,这样使用

@ComponentScan注解的时候默认就扫描当前所在类的package

实体(Entity)置于com.example.demo.domain包下

逻辑层(Service)置于com.example.demo.service包下

controller层(web)置于com.example.demo.controller层包下

static可以用来存放静态资源

templates用来存放默认的模板配置路径

Spring MVC自动配置

Spring Boot为Spring MVC提供适用于多数应用的自动配置功能。在Spring默认基础上,自动配置添加了以下特性:

代码语言:javascript复制
   1、引入ContentNegotiatingViewResolver和BeanNameViewResolver beans。
   2、对静态资源的支持,包括对WebJars的支持。
   3、自动注册Converter,GenericConverter,Formatter beans。
   4、对HttpMessageConverters的支持。
   5、自动注册MessageCodeResolver。
   6、对静态index.html的支持。
   7、对自定义Favicon的支持。

如果想全面控制Spring MVC,你可以添加自己的@Configuration,并使用@EnableWebMvc对其注解。如果想保留Spring Boot MVC的特性,并只是添加其他的MVC配置(拦截器,formatters,视图控制器等),你可以添加自己的WebMvcConfigurerAdapter类型的@Bean(不使用@EnableWebMvc注解)

静态文件

默认情况下,Spring Boot从classpath下一个叫/static(/public,/resources或/META-INF/resources)的文件夹或从ServletContext根目录提供静态内容。这使用了Spring MVC的ResourceHttpRequestHandler,所以你可以通过添加自己的WebMvcConfigurerAdapter并覆写addResourceHandlers方法来改变这个行为(加载静态文件)。

在一个单独的web应用中,容器默认的servlet是开启的,如果Spring决定不处理某些请求,默认的servlet作为一个回退(降级)将从ServletContext根目录加载内容。大多数时候,这不会发生(除非你修改默认的MVC配置),因为Spring总能够通过DispatcherServlet处理请求。

此外,上述标准的静态资源位置有个例外情况是Webjars内容。任何在/webjars/**路径下的资源都将从jar文件中提供,只要它们以Webjars的格式打包。

注:如果你的应用将被打包成jar,那就不要使用src/main/webapp文件夹。尽管该文件夹是一个共同的标准,但它仅在打包成war的情况下起作用,并且如果产生一个jar,多数构建工具都会忽略它

默认资源映射

Spring Boot 默认为我们提供了静态资源处理,使用 WebMvcAutoConfiguration 中的配置各种属性。 建议大家使用Spring Boot的默认配置方式,提供的静态资源映射如下:

代码语言:javascript复制
classpath:/META-INF/resources
classpath:/resources
classpath:/static
classpath:/public
优先级顺序为:META-INF/resources > resources > static > public
可以在application.properties中修改:
# 默认值为 /**
spring.mvc.static-path-pattern
# 默认值为 classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
spring.resources.static-locations=这里设置要指向的路径,多个使用英文逗号隔开

模板引擎

Spring Boot支持多种模版引擎包括:

1、FreeMarker

2、Groovy

3、Thymeleaf(官方推荐)

4、Mustache

JSP技术Spring Boot官方是不推荐的,原因有三:

代码语言:javascript复制
  1、tomcat只支持war的打包方式,不支持可执行的jar。
  2、Jetty 嵌套的容器不支持jsp
  3、Undertow 创建自定义error.jsp页面不会覆盖错误处理的默认视图,而应该使用自定义错误页面

当你使用上述模板引擎中的任何一个,它们默认的模板配置路径为:src/main/resources/templates。当然也可以修改这个路径,具体如何修改,可在各模板引擎的配置属性中查询并修改。

SpringBoot系列-5数据库

Mybatis整合

SpringBoot集成 https://github.com/mybatis/spring-boot-starter/wiki/Quick-Start

Mybatis分页插件: https://github.com/pagehelper/Mybatis-PageHelper

本文由 小马哥 创作,采用 知识共享署名4.0 国际许可协议进行许可 本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名 最后编辑时间为: 2017/11/23 09:28

0 人点赞