SpringBooooooooooooooooooooooooooot
就不介绍书中的那些springboot的历史了,直接进入正题把。
0 spring boot来临
0.1 spring boot的优点
依据官方的文档, Spring Boot 的优点如下:
- 创建独立的spring应用程序
- 其纳入的tomcat,jetty或者undertow,无需部署WAR文件
- 允许通过Maven来根据需要获取starter
- 尽可能的自动配置spring
- 提供生产就绪型功能,如指标,健康检查和外部配置
- 绝对没有代码生成,对xml没有要求配置
首先 Spring Boot 是一个基于 Spring 框架搭建起来的应用,其次它会嵌入Tomcat ,Jetty, Undertow服务器 ,并且不需要传统 WAR 文件进行部署,也就是说搭建 SpringBoot 项目并不需要单独下载 Tomcat 等传统的服务器。
同时提供通过 Maven (或者 Grandle )依赖的starter ,这些 starter 可以直接获取开发所需的相关包,通过这些 starter 项目就能以 Java Appli ation形式运行 Spring Boot 的项目,而无须其他服务器配置。
对于配置, Spring Boot 提供 Spring 框架的最大自动化配置,大量使用自动配置,使得开发者对 Spring 的配置尽量减少:此外还提供了 些监测、自动检测的功能和外部配置,与此同时没有附加代码和 XML 的配置要求。
约定优于配置,这是spring boot的主导思想,对于springboot而言,大部分情况下存在默认配置,你甚至可以在没有任何定义的情况下使用spring框架,如果需要自定义也只需要在配置文件配置一些属性便可以,十分方便,而对于部署这些项目必需的功能,spring boot提供starter的依赖。
------------------------------------------------正片开始-------------------------------------------------------
1 spring boot开发环境搭建和基本开发
1.1 搭建spring boot开发环境
使用 Spring Boot 首先需要搭建 个快速开发的工程环境。 Spring Boot 工程的创建存在多种方式,但是因为当前 IntelliJ IDEA 广泛应用,所以只介绍idea环境下的搭建。
1.1.1 搭建IDEA 开发环境
首先是启动idea开环境,然后选择Create New Project,就可以看到一个新的窗口,我们选择Spring Initializr(idea社区版的么有),并且将JDK切换为你想要的版本,如图:
点击next 继续下一步,进行一定的配置,如图(当然这一步是需要网络的)
在这里你可以设置项目名称,描述,war包还是jar包,java版本,项目版本,语言,类型等等。
点击next,到了可以选择starter的窗口,starter可以理解为就是springboot给我们提供的一些集成的依赖包,我们引入这些依赖包,就可以调用其中的依赖。
点击下一步,就可以看到我们已经搭建好相应的架构,有启动类,pom文件和配置属性文件(application.properties),运行启动类(我这里是DemoApplication)就可以启动spring boot工程。而pom.xml为文件则配置好了你选中的starter依赖,这样就能够基于IDEA开发SpringBoot工程了。
如果有自己配置的maven仓库的话,就要在setting里面设置,点击file - setting- 直接搜索maven,就可以看到。在这里可以配置自己的maven版本和仓库。
到这里,idea的开发环境已经搭建好。
1.2 spring boot的依赖和自动配置
以最常用的springmvc为例进行说明,首先打开maven的本地仓库,找到对应spring boot的文件夹,可以看到相应的目录:
先看 spring-boot-start-web,打开 spring-boot-start-web 文件夹,就可以看到仓库中的各个不同的版本,随便打开一个版本,找到名为 spring-boot-starter-web-1.5.19.RELEASE 的 pom文件,打开它就可以看到代码清单:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starters</artifactId>
<version>1.5.19.RELEASE</version>
</parent>
<artifactId>spring-boot-starter-web</artifactId>
<name>Spring Boot Web Starter</name>
<description>Starter for building web, including RESTful, applications using Spring
MVC. Uses Tomcat as the default embedded container</description>
<url>http://projects.spring.io/spring-boot/</url>
<organization>
<name>Pivotal Software, Inc.</name>
<url>http://www.spring.io</url>
</organization>
<properties>
<main.basedir>${basedir}/../..</main.basedir>
</properties>
<dependencies>
<!-- spring boot 的依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- tomcat 的依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<!-- hibernate 的依赖 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
<!-- json 的依赖 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<!-- spring Web 的依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<!-- springMVC 的依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
</dependencies>
</project>
从这里可以看出,当加入 spring-boot-starter-web 后,它会通过Mave将对应的资源加载到我们的工程中,这样便能够形成依赖,但是这样还不足以运行springmvc项目, 运行它还需要对 spring MVC 进行配置,让它能够生产 spring MVC的对象,才能启用。
为了探讨spring MVC 在 spring boot自动配置的问题,首先在本地下载的maven仓库的目录spring-boot-autoconfigure 中选择不同的版本,找到类似 spring-boot-autoconfigure-1.5.19.RELEASE 的jar包,解压过后,打开目录下的子目录
org-springframework-boot-autoconfigure-web-servlet (不同的版本可能路径会不同)后,就可以看到许多配置类如图:
这里可以看到存在许多的类,其中的加框的类DispatcherServletAutoConfiguration.class 就是一个对DispatcherServlet进行自动配置的类(不做过多详解,只了解部分基本代码)。DispatcherServletAutoConfiguration部分源码清单(不同版本文件内容略有差异):
//配置文件
@Conf igurat on
//配置条件满足类 DefaultD spatcherServletCondition 的验iiE
@Conditional(DefaultDispatcherServletCondition.class)
//如果存在 ServletRegistration 类则进行配置
@ConditionalOnC ass(ServletReg stration class
//如果存在对应的属性配置( Spring MVC 的是 spring mvc. *)则启用配置
@EnableConfigurationProperties(WebMvcProperties.class)
protected static class DispatcherServletConfiguration {
private final WebMvcProperties webMvcPropert es
pub DispatcherServletConfiguration (WebMvcProperties webMvcProperties) {
this.webMvcProperties = webMvcProperties;
}
通过上面的代码,可以看到spring boot内部已经自动为我们做了很多关于DispatcherServlet的配置,其中的@ EnableConfigurationProperties 还能够在读取配置内容的情况下自动生成 Spring MVC 所需的类,到这里应该明白为什么几乎在没有任何配置下就能用 spring Boot 启动 SpringMVC 项目,这些都是 Spring Boot 通过 Maven 依赖找到对应的 jar包和嵌入的服务器,然后使用默认自动配置类来创建默认的开发环境。
但是有时候,我们需要对这些默认的环境进行修改以适应个性化的要求,这些在 Spring Boot 中也是非常简单的,正如@EnableConfigurationProperties 注解那样,它允许读入配置文件的内容来自定义自动初始化所需的内容。
1.3 使用自定义配置
上节讨论了 Spring Boot 存在自动装配组件和自定义的配置 这些它都给予了开发者默认的约定配置项。关于这些内容,可以在它公布的网址上看到所有的配置项,网址是 springboot配置项链接。这些配置项多达300多项,所以十分繁琐,好在我们 并不需要全部去配置 ,只是根据自己工程的需要引入对应的 starter ,对其进行必要的配置就可以了。
这里我们需要记住的是通过这些约定的配置项就可以在很大程度上自定义开发环境,以适应真实需求。这就是spring boot的理念,配置尽量简单并且存在约定,屏蔽spring内部的细节,使得spring能够开箱后经过简单的配置后即可让开发者使用,以满足快速开发、部署和测试的需要。
如果你按照上述使用 Eclipse 或者 IntelliJ IDEA 进行新建工程,那么可以在项目中发现它还会为你创建一个属性文件 application properties ,它是 个默认的配置文件,通过它可以根据自己的需要实现自定义。例如,假设当前 8080 端口已经被占用,我们希望使用 8090 端口启动 Tomcat ,那么只需要在这个文件中添加 一行:
server.port=8090
这样启动项目后就可以看到spring boot绑定的tomcat的启动日志端口号就改变了。
事实上, Spring Boot 参数配置除了使 properties 文件之外,还可以使用 yml 文件等,它会以下列的优先级顺序进行加载:
命令行参数
来自 java:comp/env 的JIDI 属性
Java 系统属性( System.getProperties());
操作系统环境变量 Random ValuePropertySource random. * 的属性值
jar包外部的application-{profile}.properties 或 application.yml (带spring. profile )配置文件
jar包外部的application- {profile}.properties 或 application.ym(带spring.profile )配置文件
jar包外部的application.properties 或 application.yml (不带spring. profile )配置文件
jar包外部的application.properties 或 application.ym (不带spring. profile )配置文件
Configuration注解类上的@PropertySource
通过 SpringApplication.setDefaultProperties指定的默认属性。
实际上 ym 文件的配置与 properties 件只是简写和缩进差别,因此差异并不大。
1.4 开发自己的springboot项目
…