文章目录
本篇博客参照 Spring Boot官方文档,算是简单的翻译,虽然之前也学过但是没有系统阅读官方文档,有很多地方遗漏,现在重新阅读官方文档,这篇博客就当作阅读笔记,会尽量精简。因为没有使用过gradle,所以gradle部分都去掉了。
使用Spring Boot
构建系统(bulid system)
推荐使用支持依赖管理的构建工具,比如maven和gradle。
依赖管理
每一个版本的Spring Boot都有它们所支持的依赖清单,实际上,我们不需要为这些依赖指定版本号,Spring Boot已经为我们对其做了管理。当Spring Boot版本升级的时候,这些依赖也进行了升级。
当然这些依赖可以指定为某个版本。
每一个Spring Boot都和一个Spring Framework的基础版本关联,官方建议不要为其指定版本。
Maven构建项目
Maven使用者可以从spring-boot-starter-parent
工程中继承获得合理的默认依赖。父工程提供了以下特性:
-
Java 1.8作为默认的版本
-
UTF-8的编码格式
-
继承自spring-boot-dependencies pom的依赖关系管理部分,用于管理公共依赖关系的版本。此依赖关系管理允许我们在自己的pom中使用时省略这些依赖项的标记。
-
合理的资源过滤
-
合理的配置文件。
applicaton.properties
和application.yml
,以及指定的文件(application-dev.properties
和application-dev.yml
)
继承Starter Parent
<!-- Inherit defaults from Spring Boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
</parent>
只需要在这个依赖指定Spring Boot的版本,其他的starter上就不要指定版本号了。
同时也可以重写一个属性来覆盖掉个人的依赖,比如,当需要升级到另一个版本的Spring Data
时,在pom.xml
中插入以下代码
<properties>
<spring-data-releasetrain.version>Fowler-SR2</spring-data-releasetrain.version>
</properties>
查看
Spring Boot
支持的属性列表
。
不使用Parent pom
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
上面的配置不允许重写个人依赖的版本号,如果要重写,需要在Spring Boot前面添加属性。比如,要指定Spring-data-releasetrain
的版本,pom应该进行如下配置。
<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.1.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Spring Boot Maven 插件
通过maven打包命令,产生的jar包可以直接运行。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
构建代码
默认包(default package)
当一个class没有申明包名时,这个类被默认为在(default package)中。应该避免这样的使用方式,这样可能会引起使用了@ComponentScan
,@EntityScan
,@SpringBootApplication
注解的Spring Boot应用,因为每个jar包中的每个类都被读取了。应当遵循java推荐的包命名公约,使用反向域名作为包名,比如com.example.project
。
运行主类
Spring Boot官方推荐在把主类放在其他类之上的根包中,一般用在主类上。@SpringBootApplication
的源码如下,
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
....
}
可见,@SpringBootApplication
由@SpringBootConfiguration
、@EnableAutoConfiguration
和@ComponentScan
组成。
-
@SpringBootConfiguration
继承自@Configuration
,二者功能也一致,标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean
注解标记的方法的实例纳入到srping
容器中,并且实例名就是方法。 -
@EnableAutoConfiguration
的作用启动自动的配置,@EnableAutoConfiguration
注解的意思就是Springboot
根据你添加的jar包来配置你项目的默认配置,比如根据spring-boot-starter-web
,来判断你的项目是否需要添加了webmvc
和tomcat
,就会自动的帮你配置web项目中所需要的默认配置。 -
@ComponentScan
,扫描当前包及其子包下被@Component
,@Controller
,@Service
,@Repository
注解标记的类并纳入到spring容器中进行管理。是以前的<context:component-scan>
(以前使用在xml中使用的标签,用来扫描包配置的平行支持)。所以本demo中的User为何会被spring
容器管理。
最基础的Application.java
如下,会声明一个main
方法
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的配置,但是更推荐使用基于@Configration
注解的配置类。
导入额外的配置类
我们不需要把所有的@Configuration
注解放到单独的类中,可以使用@Import
注解来导入其他的配置类。 此外,可以使用@ComponentScan
注解来自动扫描所有的Spring 组件,包括加了@Configuration
注解的配置类。
如果必须使用xml作为配置的话,官方推荐在使用了@Configuration
注解的类中,加上@ImportResource
注解来加载xml配置文件。
导入XML配置
仍然使用@Configuration
类。然后,可以使用@ImportResource
批注来加载XML配置文件。
自动配置
禁用指定的配置类
使用@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 {
}
如果类不在类classpath中,则可以使用注解的excludeName属性并指定类的全名,比如
@SpringBootApplication(excludeName = {“com.learn.Example”})
Spring Bean和依赖注入
Spring Boot可以使用标准的Spring Framework的方式去构建Spring Bean以及依赖注入。简单一点,通常使用@ComponentScan
(找到bean)和@Autowired
(注入依赖)。
如果所有的类都在根包中,那么可以使用不带任何属性的@ComponentScan
注解,就可以把所有带了@Component
, @Service
, @Repository
, @Controller
等注解的类注册为Spring Bean。
下面是一个使用了@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
注解,如下:
@Service
public class DatabaseAccountService implements AccountService {
private final RiskAssessor riskAssessor;
public DatabaseAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
}
// ...
}
一般在项目中,@Autowired
会放在需要注入的域上(通常会有很多需要注入的依赖),这样可以不用写构造器,但是编译器通常会警告,但不会影响程序运行。
@SpringBootApplication注解使用
@SpringBootApplication
注解包含了以下注解的特性:
@EnableAutoConfiguration
:启用SpringBoot的自动配置机制@ComponentScan
:在应用程序所在的包上启用对@Component
注解的扫描@Configuration
:允许在上下文中注册额外的bean或导入其他配
@SpringBootApplication
注解相当于使用了以上三个使用默认配置的注解,如以下所示:
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不强制使用这些注解,我们可以使用其他功能来替换掉单个注解。比如,我们不想在程序中使用
@ComponentScan
:package com.example.myapplication; import org.springframework.boot.SpringApplication; import org.springframework.context.annotation.ComponentScan import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; @Configuration @EnableAutoConfiguration @Import({ MyConfig.class, MyAnotherConfig.class }) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
在此示例中,Application与任何其他Spring Boot应用程序一样,只是不会自动检测
@Component
注解修饰的类,并且显式导入用户定义的bean(请参阅@Import)。
运行程序
包程序打包成jar包的形式并且使用内置的HTTP服务器的最好的好处之一是,我们可以像其他程序一样来运行这个程序。Spring Boot程序进行Debugger也非常容易,不需要特使的IDE插件和扩展程序。
这一节只讲述程序打包成jar情况,如果想要把程序打包成war包的话,需要参考使用IDE和相应的中间件。
在IDE上运行
这里须要导入项目程序,在不同的IDE上有不同的操作,官方文档并没有详细讲述,不过CSDN上有很多博客都是介绍这一方面的,请自行查阅。
- 如果不小心点了两次运行程序按钮,会出现
端口号已被使用
类似的错误,这个时候只能强制结束这个进程。
运行打包之后的程序
如果使用了Spring Boot 的Maven或者Gradle插件生成了一个可执行jar包,可以执行下面java -jar
命令来运行该jar包:
$ java -jar target/myapplication-0.0.1-SNAPSHOT.jar
也可以使用一远程调用的方式来运行打包过的程序,下面的命令可以将调试器附加到打包的应用程序:
$ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n \
-jar target/myapplication-0.0.1-SNAPSHOT.jar
使用Maven插件
Spring Boot的Maven插件提供了一个快速编译运行程序的run
指令。程序会以exploded的形式运行,和IDE中相同。下面是使用Maven方式运行Spring Boot程序的命令:
$ mvn spring-boot:run
我们也可以使用MAVEN_OPS
来改变环境变量,如下:
$ export MAVEN_OPTS=-Xmx1024m
热部署
由于Spring Boot只是普通的java应用程序,因此JVM的热部署应该是开箱即用的。但是JVM的热部署受限于字节码文件。想要一个更完美的解决方案的话,可以使用JRebel。
spring-boot-devtools
模块也支持Spring Boot的快速重启,相关细节可以参考下面的Develop Tools(开发工具)
章节以及swapping "How-to"
部分。