一、构建系统
1、依赖管理
spring boot的每一个版本都提供了它所支持的依赖项列表。在使用时,你不需要在你的配置中为这些依赖提供版本,因为spring boot为你管理版本。当你升级spring boot后,这些依赖也会一致更新。
注意:如果你需要的话,可以自己指定一个版本来覆盖spring boot推荐的版本,但每一个spring boot都与一个spring framework联系,最好不要自己制定spring framework的版本
2、继承启动器父项目
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
</parent>
通过继承启动项,来从spring boot中获取默认值。
其实,spring boot启动器继承了父项目
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath>../../spring-boot-dependencies</relativePath>
</parent>
在这个父项目里指定了默认的要使用的其他启动器的版本。
因此,在我们导入依赖时,我们只需要指定的就是spring boot启动器的版本号,我们要导入其他启动器可以不用指定版本号就可以安全使用了。
如果我们需要我们要使用自己特定版本的包,我们可以通过下面的方式指定版本,
<properties>
<mysql-connector-version>指定的版本</mysql-connector-version>
</properties>
然后再需要指定的版本处通过$引用即可。
3、不继承启动器父项目
如果我们的项目需要继承自己的父项目,那么我们可以通过显示地声明所有的Maven配置。
如果不想使用spring-boot-starter-parent
,我们仍然可以通过更改其依赖范围scope=import
来使用依赖管理。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
4、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父项目,则只需要添加插件便可使用。不需要配置它,除非你想更改插件在父类中的默认设置。
5、启动器
启动器是可以包含在应用程序中,极大的方便我们对依赖的管理。
通过启动器,我们可以将spring和其他相关技术的依赖全部配置好,而不用像普通项目一样要一个一个去maven中央仓库复制粘贴。
例如:如果你要使用spring和JPA来进行数据库的访问,那么你只要添加spring-boot-starter-data-jpa
依赖,就可以将要使用的jar包和jar依赖的相关jar包全部导入项目。
启动器命名方式:
所有官方的启动器都遵循类似的命名方式。 spring-boot-starter-*
,其中*是特定类型的应用程序。 这种命名结构可以让我们快速找到需要的启动器。
而第三方启动程序通常以项目名称开头。 例如,一个名为thirdpartyproject的第三方启动程序项目通常会被命名为thirdpartyproject-spring-boot-starter。
二、代码结构
一个项目最好结构层次分明,下面是一个示例:
com
+- example
+- myapplication主程序
+- Application.java
|
+- customer
| +- Customer.java
| +- CustomerController.java
| +- CustomerService.java
| +- CustomerRepository.java
|
+- order
+- Order.java
+- OrderController.java
+- OrderService.java
+- OrderRepository.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的配置。在使用spring时,我们通过xml文件进行配置。而spring boot我们通过配置类来进行配置。@Configuration注解的类便是配置类,配置类可以有多个,通常我们将有main方法的类作为主配置类。
1、 导入其他配置类
您不需要将所有@Configuration配置类放在一个类中。使用@Import注释可以导入其他配置类。或者使用@ComponentScan来自动获取所有Spring组件,包括@Configuration类。
2、导入xml配置
如果你一定要使用基于XML的配置,仍然建议从配置类开始。
在一个@Configuration标注的配置类上,使用@ImportResource(xml配置文件路径),就可以将xml中的配置的内容导入并生效。
四、自动配置
Spring Boot自动配置尝试根据所添加的jar依赖项自动配置Spring应用程序。
也就是说,我们添加的jar包使用时需我们要配置一些bean,spring boot会自动帮我们配置,我们可以直接使用而不用再去配置了。例如,如果HSQLDB在您的类路径中,并且您没有手动配置任何数据库连接bean,那么Spring Boot将自动配置内存中的数据库。
你可以通过在@Configuration配置类上加上@EnableAutoConfiguration或@SpringBootApplication(主程序)来使其开启自动配置。
注意:我们应该只添加一个@SpringBootApplication或@EnableAutoConfiguration注释。我们通常只向主@Configuration类(有main方法的类)添加@SpringBootApplication注解。
1、逐渐取代自动配置
自动配置固然方便,但是默认的配置毕竟不可能满足我们的所有需求。这是我们就需要更改或添加自己的配置了。
spring boot的自动配置是非侵入性的。我们可以通过自定义配置,以替换自动配置的相应的部分。 例如,如果您添加自己的DataSource bean,则默认的嵌入式数据库支持将退出。
如果你需要了解当前正在应用哪些自动配置以及原因,可以使用--debug
开关启动你的应用程序。 这样做可以启用调试日志,来让控制台打印生效的自动配置类。
2、禁用指定的自动配置类
如果你发现应用了不想要的自动配置类,可以使用@SpringBootApplication的exclude属性(在类路径下)来禁用它们,如下面的示例所示:
import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc.*;
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
public class MyApplication {
}
如果要禁用的类不在类路径中,则可以使用注解的excludeName
属性,并指定禁用的自动配置类的全类名。 如果你更喜欢使用@EnableAutoConfiguration
而不是@SpringBootApplication
,使用exclude
和excludeName
属性也是一样的。
除此之外,你还可以在全局配置文件application.properties使用spring.autoconfigure.exclude
属性指定要排除的自动配置类的列表。
五、spring bean和依赖注入
您可以自由使用任何标准的Spring Framework技术来定义bean以及注入依赖项。
为简单起见,我们发现使用@ComponentScan(查找您的bean)和使用@Autowired(进行构造函数注入)效果很好。
1、扫描bean
如果按照第二节的建议构造代码(将应用程序类定位在根包中),可以添加@ComponentScan,而不需要任何参数,@ComponentScan也可省略。
所有应用程序组件(@Component、@Service、@Repository、@Controller等)都自动注册为Spring bean。
这是因为@SpringBootApplication
和@EnableAutoConfiguration
会自动扫描自己所在的包及其子包。
2、依赖注入
下面的示例显示了一个@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;
}
// ...
}
ioc容器在将@Service标注的类注册到容器中时,会调用其构造方法,构造方法的调用,使我们获得了所需的RiskAssessor
Bean。不过我们要知道的是,构造方法的参数的值也来自ioc容器。
如果一个bean只有一个构造器,@Autowired
可忽略不写。
如下方所示:
@Service
public class DatabaseAccountService implements AccountService {
private final RiskAssessor riskAssessor;
public DatabaseAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
}
// ...
}
六、@SpringBootApplication注解的使用
许多Spring Boot开发人员喜欢他们的应用程序使用自动配置,组件扫描,并能够在其“应用程序类”上定义额外的配置。
单个@SpringBootApplication注解可以同时启用这三个功能,即:
@EnableAutoConfiguration
: 开启spring boot的自动配置机制@ComponentScan
:对应用程序所在的包启动自动扫描@Configuration
: 允许在上下文中注册额外的bean或导入额外的配置类
因此我们在应用程序类上使用@SpringBootApplication
最佳
package com.example.myapplication;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication // 相当于 @Configuration @EnableAutoConfiguration @ComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@SpringBootApplication
还为@EnableAutoConfiguration
自动配置的bean和@ComponentScan
扫描的bean提供了别名。即类名首字母小写
@SpringBootApplication
的使用不是强制性的,如果需要的话,可以使用需要的功能就够了。
七、运行应用
将应用程序打包为jar并使用嵌入式HTTP服务器的最大优点之一是可以像运行其他应用程序一样运行应用程序。调试Spring启动应用程序也很容易。您不需要任何特殊的IDE插件或扩展。
1、从IDE运行
以Maven应用导入IDE中,可以像运行简单的java应用程序一样运行spring boot应用。
2、作为打包的应用程序运行
如果你是使用Spring Boot Maven或Gradle插件创建可执行jar包,则可以使用java -jar运行应用程序,如以下示例所示:
$ jar -jar myapplication-0.0.1-SNAPSHOT.jar
八、开发者工具
Spring Boot包含一组额外的工具,可以使应用程序开发体验更好。spring-boot-devtools模块可以包含在任何项目中,以提供开发时的特性。要包含devtools支持,将模块依赖项添加到的构建中即可。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
在运行完全打包的应用程序时,将自动禁用开发人员工具。
如果您的应用程序是从java -jar启动的,或者是从一个特殊的类加载器启动的,那么它就被认为是一个生产应用程序。
如果这不适用于您(例如,如果您在容器中运行您的应用程序),请考虑排除devtools或设置-Dspring.devtools.restart.enabled=false 系统属性。
1、默认属性
Spring Boot支持的一些库使用缓存来提高性能。例如,模板引擎缓存已编译的模板,以避免重复解析模板文件。此外,在提供静态资源时,Spring MVC可以在响应中添加HTTP缓存头。
缓存在产品使用中很有好处,但在开发过程中却适得其反,使你无法看到自己刚刚在应用程序中所做的更改。 因此,默认情况下,spring-boot-devtools禁用缓存选项。这样,你每次作出的修改,都会显示出来。
缓存选项通常由application.properties
文件中的设置配置。 例如,Thymeleaf提供spring.thymeleaf.cache
属性。 spring-boot-devtools
模块不需要手动设置这些属性,而是在开发时自动应用合理的配置。
因为在开发Spring MVC和Spring WebFlux应用程序时,您需要很多关于web请求的信息,所以开发者工具将为web日志组启用调试日志。
这将为你提供传入请求的相关信息,如正在处理这个请求的handle、响应结果等信息。如果希望记录所有请求细节(包括潜在的敏感信息),可以打开spring.http.log-request-details配置属性。
如果您不希望应用默认属性,则可以在application.properties中将spring.devtools.add-properties设置为false。
2、自动重启
每当classpath路径下的文件有更改时,使用spring-boot-devtools的应用程序都会自动重新启动。
在IDE中工作时,这可能是一个有用的功能,因为它为代码更改提供了非常快速的反馈循环。 默认情况下,将监视类路径上指向文件夹的任何条目的更改。 请注意,某些资源(例如静态资产和视图模板)不需要重新启动应用程序。
Spring Boot提供的重启技术通过使用两个类加载器来工作。 不变的类(例如,来自第三方jar的类)将被加载到基类加载器中。 您正在积极开发的类将加载到重新启动类加载器中。 重新启动应用程序时,将丢弃重新启动类加载器,并创建一个新的类加载器。 这种方法意味着应用程序的重启通常比“冷启动”要快得多,因为基本类加载器已经可用并已填充。
详细功能待填充。