本次对Spring Boot的运行细节进一步介绍。
文章目录
一 Build Systems(构建系统)
Spring Boot
官方文档中建议可以使用发布到Maven central
的库的开发平台。
事实上,Spring Boot
官方文档中指出使用Maven
和Gradle
两种方式作为构建系统都是适配的。
个人理解,Maven
和Gradle
是两种根据用户自定义的文件自动从中央仓库下载所需文件的工具。
1.1 依赖关系管理
Spring Boot
的每一个版本都提供了它支持的依赖项列表,实际上,在我们的maven
配置文件中,并不需要给定这些依赖项的版本号,因为Spring Boot
会为我们自动指定这些依赖项的版本,所以我们只需要给定Spring Boot
的版本就好了,当然,你也是可以为依赖项指定版本号的,这会覆盖掉Spring Boot
的推荐版本。
依赖项列表中包含了Spring Boot
用到的Spring
模块,官方文档中指出不建议更改推荐的版本。
Each release of Spring Boot is associated with a base version of the Spring Framework. We highly recommend that you not specify its version.
1.2 maven
在使用Maven作为构建系统时,我们通过继承spring-boot-starter-parent
项目获得默认工具包,这个父项目包括几个特点:
- 默认为
Java 1.8
- 编码为
UTF-8
- 无须指定依赖项的版本
- 合理的资源过滤
- 合理的插件配置
- 合理的资源过滤,(
application.properties||application.yml
)
1.2.1 继承starter parent
在maven
中,首先定义parent
为:
<!-- Inherit defaults from Spring Boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.3.BUILD-SNAPSHOT</version>
</parent>
如果你不想使用Spring Boot
所推荐的依赖项版本,你可以在pom.xml
中定义:
<properties>
<spring-data-releasetrain.version>Fowler-SR2</spring-data-releasetrain.version>
</properties>
1.2.2 不想使用parent?
一些用户不想从spring-boot-starter-parent
继承以获得Spring Boot
支持。也可以这样引入:
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.3.BUILD-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
这样做的好处是可以使用scope=import
实现清晰管理。
据我理解,在maven
中使用scope=import
的流程是:首先在一个父pom.xml
中定义所有需要的依赖,然后在子pom.xml
中获得所需要的依赖,这样做使得结构十分清晰。这也使得在Spring Boot
中无须继承父类starters
也可获得Spring Boot
支持。
如果你不想使用Spring Boot
所推荐的依赖项版本,你可以在pom.xml
中定义:
<dependencyManagement>
<dependencies>
<!-- Override Spring Data release train provided by Spring Boot -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-releasetrain</artifactId>
<version>Fowler-SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.3.BUILD-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
1.2.3 Spring Boot Maven Plugin使用
Spring Boot
提供了打包插件,可以在pom.xml
中这样定义:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
1.3 Starters
Starters
是在应用程序中定义的依赖关系描述符。在项目中,只需要把Starters
引入进来,你就可以开始做项目了。例如,如果想要使用Spring
和JPA
进行数据库访问,在项目中包含Spring -boot-starter-data- JPA
依赖项即可。
Starters
中包含使程序运行起来的很多依赖项。
**命名:**官方的Starters
命名类似,为spring-boot-starter-*
,第三方Starters
不能以spring-boot
开头,常以项目的名称开始。
二 Structuring Your Code(代码组织)
Spring Boot没有特定的代码规范标准,下面是一些建议。
2.1 default Package的使用
如果一个类中没有声明package
,则被认为存在于default package
之中,Spring Boot官方文档中指出这种类不应该存在,也可能会导致一些问题。
We recommend that you follow Java’s recommended package naming conventions and use a reversed domain name (for example,
com.example.project
).
2.2 主程序类位置
建议将主程序类放在root package
之中,在其它类之上。注解@SpringBootApplication
常用于主程序类之中。
If you don’t want to use
@SpringBootApplication
, the@EnableAutoConfiguration
and@ComponentScan
annotations that it imports defines that behaviour so you can also use those instead.
一个常用的layout
如下:
com
+- example
+- myapplication
+- Application.java
|
+- customer
| +- Customer.java
| +- CustomerController.java
| +- CustomerService.java
| +- CustomerRepository.java
|
+- order
+- Order.java
+- OrderController.java
+- OrderService.java
+- OrderRepository.java
其中main
方法在Application.java
中声明(包含@SpringBootApplication
注解),就像下面这段代码一样:
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);
}
}
三 Configuration Classes(配置类)
Spring Boot支持基于Java的配置手段。尽管它也支持基于XML文件的配置手段,但Spring Boot官方文档指出更推荐使用@Configuration
使Java类成为一个主要源(也就是定义了main
方法的类)。
不需要将@Configuration
放到所有类中。@Import
注解可用于导入其他配置类。或者,也可以使用@ComponentScan
注解来自动获取所有Spring组件。
如果仍想要使用基于XML的配置,建议从@Configuration
类开始。然后使用@ImportResource
注解来加载XML配置文件。
四 Auto-configuration(自动配置)
Spring Boot可以根据所引入的依赖包对Spring Application进行自动的配置。
添加@EnableAutoConfiguration
或者@SpringBootApplication
注解可以启动自动配置。
You should only ever add one
@SpringBootApplication
or@EnableAutoConfiguration
annotation. We generally recommend that you add one or the other to your primary@Configuration
class only.
自动配置是非侵入性的,这意味着更改或取消某个自动配置是很容易的。
五 Spring Beans and Dependency injection
关于Spring Beans和Dependency的注入问题,常使用@ComponentScan
和@Autowired
实现。
如果按照上面的建议组织代码(将应用程序类定位在root package
中),则可以添加@ComponentScan
而不需要任何参数。所有应用程序组件(@Component
、@Service
、@Repository
、@Controller
等)都将自动注册为Spring bean
。
@Service | @Controller | @Repository | @Component |
---|---|---|---|
业务层组件 | 控制层组件 | 数据访问层组件 | 泛指组件 |
举个例子:
package com.example.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class DatabaseAccountService implements AccountService {
private final RiskAssessor riskAssessor;
@Autowired
public DatabaseAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
}
// ...
}
六 @SpringBootApplication注解的使用
简单地说:
@SpringBootApplication
实现了@EnableAutoConfiguration
、@ComponentScan
和@Configuration
的功能。
package com.example.myapplication;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
七 运行程序
将应用程序打包为jar
并使用嵌入式HTTP
服务器的最大优点之一是可以像运行其他应用程序一样运行Spring Boot
应用程序。调试Spring Boot应用程序也很容易,不需要任何特殊的IDE插件或扩展。
八 开发者工具
Spring Boot还包含额外工具以使应用程序开发更为方便快捷。在maven中添加开发者工具如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
开发者工具提供了热加载、缓存禁用等有用的特性,可以尝试~
注:文章参考Spring Boot官方文档完成