本章节,将要通过细节告诉你如何使用spring boot,包括的话题,如构建系统、自动配置,如何运行你的应用。也包括了spring boot的最佳实践。尽管这里没有关于spring boot的一些特殊的说明(你可以假定是另一个库),但是这里有一些建议,会使你的开发过程变的更加容易一些。
构建系统
我们强烈建议你选择一个支持依赖管理的构建系统工具,并且它可以使得组件发布到 "Maven Central"仓库里。我们建议你使用maven 或者gradle。你有可能使用其它的构建系统(Ant 等等)来开始spring boot开发,但是支持并不是很好。
spring boot 每一个版本都提供了它支持的依赖列表,在实践中,你不需要提供一个版本对于它们的任何依赖在你的配置中,因为spring boot管理为你做了这部分的工作。当你升级你的spring boot 版本的时候,这些依赖也会随着升级。这里只说明maven。
Maven
maven 的用户可以继承于"spring-boot-starter-parent"工程来获取默认的配置。
父工程会提供以下的特点:
1、默认的java编译版本,这里是java 1.8
2、UTF-8源码编码。
3、部分依赖管理,继承于spring-boot-dependencies pom 它管理者通用的依赖版本,这些依赖管理可以使你在你使用pom依赖的时候,忽略版本的标签。
4、敏感的资源过滤
5、敏感的插件配置
6、敏感的资源过滤,对于application.properties 和application.yml;包括特定的配置文件(例如:application-dev.properties和application-dev.yml)
既然application.properties和application.yml接受spring 方式的占位符(${...}),Maven过滤被改变使用@..@占位符。
继承start parent
配置你的工程,继承 spring-boot-starter-parent。设置parent,如下:
<!--继承spring boot 默认-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
</parent>
你可以通过重写项目里的属性来重写你的个人的依赖。例如版本依赖:
<properties>
<springboot.version>2.0.4.RELEASE</springboot.version>
</properties>
不继承parent依赖
并不是所有的人都喜欢继承spring-boot-starter-parent pom,你或许有你自己的团体公共的父工程,这个工程,是你需要使用或者你喜欢在你所有的maven配置中声明。如果你不想使用spring-boot-starter-parent,你仍然可以通过使用一个scope=import的依赖来保持依赖管理(并非插件管理)的好处。如下:
<dependencyManagement>
<dependencies>
<dependency>
<!-- 从Spring Boot导入依赖管理 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.4.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
使用spring boot maven 插件
spring boot 的maven插件可以打包工程,打包成可执行的jar包文件。如果你想用它,那么添加插件到<plugins>节点中:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
提示:如果你使用spring boot starter pom,你只需要添加插件,不需要配置它,除非你想改变设置,定义在父工程中。
代码结构
spring boot 不需要任何的特定的代码布局来工作,无论如何,这有一些最好的实践方式来帮助你。
当一个类中不包括一个包的声明,那么它被认为是默认的包中。使用默认的包,通常是不被鼓励的,应当避免使用。它可以引起一些特别的问题对于spring boot的应用,此应用会读取每一个jar包中的每个类用于@ComponentScan或者@EntityScan 或者@SpringBootApplication注解。建议遵循java的包名约定,使用反向域名来命名包名。
定义main方法应用类
我们通常会建议你把你的main应用类放到包的根目录下。@SpringBootApplication注解经常放到main方法的类中,隐式的定义基础搜索包。布局如下:
com
+- example
+- myapplication
+- Application.java
|
+- customer
| +- Customer.java
| +- CustomerController.java
| +- CustomerService.java
| +- CustomerRepository.java
|
+- order
+- Order.java
+- OrderController.java
+- OrderService.java
+- OrderRepository.java
Application.java将会声明main方法,并且被@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);
}
}
配置
spring boot 支持基于java的配置。虽然可以用xml的资源配置spring 应用,我们还是建议你的源代码是单一@Configuration来配置的类。定义了main方法的类作为@Configuration配置是个非常好的选择。
加载配置
你不必把所有的配置,用@Configuration配置到一个类,你也可以用@Import注解引入其它的配置类。你也可以用@ComponentScan来自动的捡起所有的自动配置,包括@Configuration配置类。
如果你必须使用xml的配置,我们还是建议你使用@Configuration;你也可以使用@ImportResource 注解来加载xml配置文件。
自动配置
spring boot 自动配置 自动的配置基于你添加的jar包依赖来配置你的spring应用。
逐步替换自动配置
自动配置是非侵入性的,无论在任何地方,你都可以定义你自己的配置来取代自动配置的特殊部分。
禁用特定的自动配置类
如果你发现了有一个自动配置的类,你不想应用,那么你可以使用@EnableAutoConfiguration注解的exclude属性来禁用它,如下:
import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc.*;
import org.springframework.context.annotation.*;
@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration {
}
如果被禁用的类不在当前的类包下,可以用excludeName属性,用完整的包名+类名来代替。最后你也可以通过使用spring.autoconfigure.exclude属性来控制自动配置类的列表来禁用。
依赖注入
你可以自由的使用任何标准的spring 框架技术来定义你的beans和它们的注入关系。为了简单,我们使用@ComponentScan(发现你的bean)和@Autowired(类构造注入)效果更好。如果按照这个建议作为你的代码架构,那么你可以无任何争论的天机@ComponentScan注解。所有的应用组件(@Component和@Service和@Repository,@Controller)都会自动的注册为spring beans.
例如@Service好bean使用构造函数注入来获取所需要的RiskAssessor bean:
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;
}
// ...
}
如果这个类只有一个构造函数,那么你可以忽略@AutoWired.
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;
public DatabaseAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
}
// ...
}
@SpringBootApplication
一些spring boot的开发者喜欢他们的app使用自动注解、组件扫描和有可能添加一些他们自己定义的额外的配置到他们应用的类中,单一的@SpringBootApplication注解可以启用以下的特征:
1、@EnableAutoConfiguration 运行spring boot 自动配置机制
2、@ComponentScan 运行@Component 扫描 应用程序所在的包
3、@Configuration 允许应用程序注册额外的bean,通过上下文,或者引入额外的配置类。
@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);
}
}
相比于上一章节的模糊认识来说,你现在应该知道如何使用spring boot和一些你应该遵循的优化的实践建议。那么,下一篇来认识更深入的东西吧。