本篇文章基于官方文档的Using Spring Boot章节, 包括Build System,Structuring your code, Configuration Classes以及Auto-Configuration四部分。
构建方式
在文档的开始,下面一段话描述了官方想告诉给我们的东西。
This section goes into more detail about how you should use Spring Boot. It covers topics such as build systems, auto-configuration, and how to run your applications. We also cover some Spring Boot best practices. Although there is nothing particularly special about Spring Boot (it is just another library that you can consume), there are a few recommendations that, when followed, make your development process a little easier.
大意就是本部分更细节地讲述如何使用Spring Boot。包括了如何构建项目,自动装配(其实auto-configuration不翻译更好),以及如何运行开发的应用。再者,官方在这个部分提供了一些最佳实践,官方大佬觉得,如果我们遵守了这些最佳实践,我们的开发过程会更happy。
官方大佬推荐我们使用Maven或者Gradle构建,大部分Java开发人员对Maven都是熟悉的,所以我们本系列文章只关注Maven,Gradle大家可以自己看,也许后面会有单独的文章专门讲解Gradle,但是这个不必期待。
特别强调,官方提供了Ant方式构建系统的支持,但是不推荐使用这个。(其实我也不会!)
Spring Boot 建议我们使用Maven或者Gradle, 有很大一部分原因是因为包依赖版本的复杂性。如果有过前些年非Maven构建的那种Java Web项目开发经验,就应该了解依赖包的冲突问题是个老大难,当时网络上充斥了大量的如何搭建SSH框架,如何搭建SSM框架的文章。Spring Boot通过Maven和Gradle的依赖关系管理,在版本发布的时候就在Parent里面指定了相关依赖的版本号。所以我们在开发过程中引入某个Spring Boot已经指定版本号的包的时候,只需要指定artifactId和groupId即可,version会从parent继承下来。当然,你也可以自定义升级某个版本号,谁让现在动不动就各种CVE漏洞呢!
Each release of Spring Boot is associated with a base version of the Spring Framework. We highly recommend that you not specify its version.
官方大佬在文档里面强调了很多次,你可以自己改构建方式,改依赖版本... 但是,尽量别改!后面就不啰嗦这些了。总之,尽可能用官方提供的最佳实践就好。
我们在https://blog.hanbinit.com.cn/archives/127里面讲了如何使用Maven方式创建一个Spring Boot项目。所以就不赘述了。
Starter
Spring Boot的Starter是一个很优秀的东西。Starter为我们实现各种功能提供了一站式的接入方式。比如我们要在项目中使用JPA,那么直接引入spring-boot-starter-data-jpa
就可以了。spring-boot-starter-data-jpa
包括了引入jpa需要依赖的其他第三方包,以及要开启JPA的相关默认配置。Starter可以让我们对某个特性的需求做到开箱即用。
随着Spring Boot的流行,Starter越来越多了。官方的Starter命名都是spring-boot-starter-*
这样的格式。*一般根据特性来指定。也有一些第三方Starter,但是第三方Starter一般命名都是thirdpartproject-spring-boot-starter
,第三方的Starter不以spring-boot-starter
开头。Starter是很好创建的,官方提供了指导:Creating Your Own Starter. 有兴趣的可以看看,如果不想看官方的,可以看看这篇:如何编写自己的Spring Boot的Starter。
官方将自己的Starter分了下类: Starter 这里有三个Table. 占篇幅比较大,大家点前面链接进去看就好。
三大类分别是引入功能特性的Starter、为生产监控准备的Starter、以及可以自定义某种技术方案的Starter。
功能特性的Starter很好理解,比如前面提到的spring-boot-starter-data-jpa
。为生产监控准备的Starter只有一个,就是spring-boot-starter-actuator、最后还有一类,这类主要是为了切换项目中的某些技术方案,比如默认容器是Tomcat,但是咱就喜欢jetty,那就引入spring-boot-starter-jetty
。从spring-boot-starter-web
中排除spring-boot-starter-tomcat
。
代码结构
前面我们有提过,Spring Boot应用本质上就是一个Maven结构的项目,官方也只是在传统的基础上为我们提供了一些“最佳实践”而已。
不建议似乎用“default” 包。 也就是不建package。将类直接扔在default package里面。这个具体会引发什么问题,官方没说,之前有遇到过,都是一些莫名其妙的问题,比如说service找不到了之类的。
将启动类放在root package里面。root package指的高于其他所有类的那个package目录。如果按照这个结构规划代码结构,一般启动类里面加一个@SpringBootApplication就可以搞定,否则的话,就要使用@EnableAutoConfiguration和@ComponentScan的组合来指定你的其他包路径。
官方给了一个建议的目录结构,一般情况下大家也都使用的是这个:
com
+- example
+- myapplication
+- Application.java
|
+- customer
| +- Customer.java
| +- CustomerController.java
| +- CustomerService.java
| +- CustomerRepository.java
|
+- order
+- Order.java
+- OrderController.java
+- OrderService.java
+- OrderRepository.java
几乎在90%的情况下,启动类用下面这段代码都是可以的!
package com.example.myapplication;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
在Spring Boot中不建议使用XML进行配置了。 建议使用@Configuration注解的方式,构造配置类。而且,Spring 还提供了@Import注解,可以将一个普通的类交给Spring去管理,这样我们就不需要在每个配置类上面都加上@Configuration了。如果一定要使用XML配置,官方也建议我们尽量使用@Configuration注解编写Java代码,使用@ImportResource注解去加载XML配置。
Auto Configuration
一般情况下,我们为Spring Boot项目引入的依赖,框架都会尽可能地帮我们去做自动配置,比如引入了Mysql 驱动,框架就认为我们要使用Mysql数据库,会在启动的时候自动加载数据库配置。
Auto Configuration的实现是基于一系列的XXXAutoConfiguration来实现的,如果我们不需要使用某个自动配置类,直接在启动类中exclude即可。比如下面的代码就让DataSourceAutoConfiguration失效了。
import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc.*;
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
public class MyApplication {
}