Using Spring Boot
使用Spring Boot进行开发 (springdoc.cn)
一 构建系统
构建系统是一个用于简化Spring应用程序的初始化开发过程的框架
它提供了一套约定和默认配置,帮助开发人员快速搭建开发Spring应用程序
并提供了一些开发工具和扩展,替身开发效率和便捷性
1.1 依赖管理
Spring Boot的每个版本都提供了所支持的依赖的列表
我们不需要在构建配置中为这些依赖声明版本,Springboot会为我管理这些依赖管理
我们也可以自己声明依赖的版本 来覆盖SpringBoot默认版本
spring-boot-dependencies 的使用
- 继承parent
在pom.xml中添加
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.4.RELEASE</version>
</parent>
这样 当我们再导入需要的springboot starter 就可以忽略版本号了
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
1.2 Maven
Maven是一个开源的项目管理工具,用于构建、发布和管理Java项目。
它提供了一种结构化的方式来组织和管理项目的依赖关系,并自动处理编译、测试、打包等任务。
Maven官方文档
1.3 Starter
Starter是一系列的依赖 你可以在你的应用中导入他们
Starter含了很多你需要的依赖,以使项目快速启动和运行,并拥有一套一致的、受支持的可管理的过渡性依赖。
二 代码结构
2.1 default 包
当一个类不包括package的声明时,它被认为是在 “default package” 中。
通常不使用default package
对于使用了@ComponentScan, @ConfigurationPropertiesScan, @EntityScan 或者 @SpringBootApplication 注解的Springboot的应用程序来说,项目中的所有jar的所有class都会被扫描
我们一般使用 域名反转作为包名(例如:com.example.project)
2.2 启动类的位置
我们通常建议将启动类放在根package中 高于其他的类 ,@SpringBootApplication 注解一般都是用在启动类上的,它默认会扫描当前类下的所欲子包。
@SpringBootApplication 默认只会扫描加载你项目工程中的组件。
你也可以使用@EnableAutoConfiguration 和 @ComponentScan 也可以用来代替@SpringBootApplication
MyApplication.java 文件声明了main方法 ,以及标识了基本的@SpringBootApplication注解
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
三 Configuration 类
SpringBoot倾向于通过Java代码来进行配置的定义
也会有使用XML文件来配置SpringBoot
但是一般还是使用@Configuration 类 来进行配置
通常启动类是主要的@Configuration
@Configuration 注解 用于定义当前类为配置类
通常情况下 加了@Configuration 的配置类内部会有一个或多个@Bean注解的方法
@Bean 注解 工厂方法
这里大家很容易产生一个误解,认为只有在加了@Configuration的配置类中,使用@Bean,才能将自定义创建的对象放入Spring容器中。
其实不然,在Spring中:万物皆为配置类。
在任何能够被Spring管理的类(比如加了@Component的类)中,定义@Bean方法,都能将自定义对象放入到Spring容器
@Bean本身的能力和@Configuration无关哦。
@Configuration继承了@Component 这意味着@Configuration拥有@Component的全部功能,这也正是只加@Configuration,也能被Spring扫描并处理的原因。
3.1 导入额外的Configuration 类
你不需要把所有的 @Configuration 放在一个类中。
@Import 注解可以用来导入额外的配置类。
另外,你可以使用 @ComponentScan 来自动扫描加载所有Spring组件
3.2 导入XML Configuration
如果你确实需要使用基于XML的配置
建议仍然从@Configuration 类开始
然后通过@ImportResource 注解来加载XML配置文件
3.3 @Bean
讲解Spring的@bean注解
@Bean注解 就是生成一个Bean ,并将他交给Spring容器去管理
@Bean注解是用于声明一个Bean的方法,通常用在@Configuration类中。
当Spring容器启动时,会扫描所有带有@Bean注解的方法,并将其返回值作为一个Bean注册到容器中。
@Bean的作用是:
1.创建Bean实例:使用@Bean注解标记的方法将被调用,返回的对象将被注册为一个Bean实例。
2.自定义Bean的创建逻辑:通过@Bean注解可以自定义Bean的创建过程,可以手动实例化和初始化Bean,也可以根据条件进行条件化的Bean创建。
3.注入其他Bean:@Bean方法可以接受其他Bean作为参数,从而实现对其他Bean的引用和依赖注入。
4.配置Bean属性:通过方法参数或方法体内部代码,可以配置Bean的属性和依赖关系。
5.提供单例模式的Bean:默认情况下,通过@Bean注解声明的Bean都是单例模式的,即每次获取该Bean时都会得到同一个实例。
@Bean注解的作用是在@Configuration类中声明一个Bean的方法,用于创建、定制和注册Bean实例到Spring容器中。
四 自动装配(配置)
Spring Boot的自动装配机制会试图根据你所添加的依赖来自动配置你的Spring应用程序。
你需要将 @EnableAutoConfiguration 或 @SpringBootApplication 注解添加到你的 @Configuration 类中,从而开启自动配置功能。
你应该只添加一个 @SpringBootApplication 或 @EnableAutoConfiguration 注解。 建议添加到主要的 @Configuration 类上。
4.1 逐步取代自动配置
自动配置是非侵入性的
在任何时候,你都可以开始定义你自己的配置来取代自动装配的特定部分
如果你想知道在应用中使用了哪些自动配置,你可以在启动命令后添加 --debug 参数。 这个参数会为核心的logger开启debug级别的日志,会在控制台输出自动装配项目以及触发自动装配的条件。
4.2 禁用指定的自动装配类
如果你想禁用掉项目中某些自动装配类,你可以在@SpringBootApplication注解的exclude属性中指定
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class MyApplication {
}
你可以同时使用注解 + 配置的方式来禁用自动装配类。
五 Spring Bean 和依赖注入
可以使用任何标准的Spring技术 定义Bean和依赖注入关系。
推荐使用构造函数注入,并使用@ComponentScan注解来扫描Bean
你可以在启动类中添加@ComponentScan注解,也不需要定义它的参数
这样你的所有应用组件(@Component、@Service、@Repository、@Controler和其他)都会自动注册为Spring Bean
@SpringBootApplication注解中包含了@ComponentScan
如果一个Bean有多个构造函数,你需要用 @Autowired 注解来告诉Spring该用哪个构造函数进行注入。
@Service
public class MyAccountService implements AccountService {
private final RiskAssessor riskAssessor;
private final PrintStream out;
@Autowired
public MyAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
this.out = System.out;
}
public MyAccountService(RiskAssessor riskAssessor, PrintStream out) {
this.riskAssessor = riskAssessor;
this.out = out;
}
// ...
}
@Autowired详解
@Autowired可以标注在属性上、方法上和构造器上,来完成自动装配。
@Autowired原理:
举例:@Autowired
private BookService bookService;
1)、先按照类型去容器中找到对应的组件;
bookService = ioc.getBean(BookService.class)
①、找到一个:找到就赋值
②、没找到就报异常
③、按照类型可以找到多个?找到多个如何装配上?
a、类型一样就按照变量名为ID继续匹配
Ⅰ、匹配上就装配
Ⅱ、没有匹配?报错
原因:因为我们按照变量名作为id继续匹配的
使用@Qualifier指定一个新的id
找到就匹配
六 使用@SpringBootApplication注解
@SpringBootApplication的功能:
●@EnableAutoConfiguration:启用Spring Boot的自动配置机制。
●@ComponentScan:对应用程序所在的包启用 @Component 扫描。
●@SpringBootConfiguration:允许在Context中注册额外的Bean或导入额外的配置类。这是Spring标准的 @Configuration 的替代方案,有助于在你的集成测试中检测配置。
七 运行你的应用
应用打包成可执行的jar,使用嵌入式HTTP服务器最大优势,就可以像其他程序一样运行
7.1 运行打包后的应用
使用Spring Boot的Maven或Gradle插件来创建可执行jar,你可以使用 java -jar 来运行你的打包后应用程序
$ java -jar target/myapplication-0.0.1-SNAPSHOT.jar
打包后的jar程序,也可以使用命令行参数开启远程调试服务
$ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n \
-jar target/myapplication-0.0.1-SNAPSHOT.jar
7.2 使用Maven 插件
Spring Boot Maven 插件包括一个 run 目标(goal),可用于快速编译和运行你的应用程序。
$ mvn spring-boot:run
7.3 热部署
Spring Boot应用程序是普通的Java应用程序,JVM的热替换功能可以直接使用。
八 开发者工具(Developer Tools)
Spring Boot 提供了一套额外的工具,可以让你更加愉快的开发应用。
spring-boot-devtools 模块可以包含在任何项目中,以在开发期间提供一些有用的特性。
Maven:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
8.1 属性的默认值
SpringBoot支持的一些库中 会使用缓存来提高性能。
虽然缓存在生产者非常有效 但是在开发中肯会起到反作用 spring-boot-devtools默认禁用了缓存选项
缓存选项通常是通过application.properties文件的属性来配置的
spring-boot-devtools会在开发场景下合理设置这些属性
8.3 自动重启
使用spring-boot-devtools 的应用程序会在classpath上的文件发生变化时自动重启
触发重启:
由于DevTools监控classpath资源,触发重启的唯一方法是更新classpath。
无论你使用的是IDE还是构建插件,被修改的文件都必须被重新编译以触发重启。
●在IntelliJ IDEA中,构建项目( Build +→+ Build Project )有同样的效果。
●如果使用构建插件,运行Maven的 mvn compile 或Gradle的 gradle build 会触发重启。
如果你用Maven或Gradle的构建插件重启,你必须将 forking 设置为 enabled。 如果你禁用 forking,devtools使用的“应用隔离类加载器(isolated application classloader)”将不会被创建,重启功能将无法正常运行。
DevTools依靠应用程序上下文的关机hook来在重启期间关闭它。 如果你禁用了关机钩子( SpringApplication.setRegisterShutdownHook(false) ),它就不能正确工作。
DevTools需要定制 ApplicationContext 所使用的 ResourceLoader。 如果你的应用程序已经提供了一个,它将被“包装”(装饰者设计模式)起来。 不支持直接覆盖 ApplicationContext 上的 getResource 方法。
8.3.1 记录条件评估变化
默认情况下,每次应用重新启动时,都会记录一份现实条件的评估报告
该报告显示你的应用程序的自动配置的变化
禁用报告记录:
spring.devtools.restart.log-condition-evaluation-delta=false
spring:
devtools:
restart:
log-condition-evaluation-delta: false
8.3.2 排除资源
某些资源在被改变时不一定需要触发重启。
可以这样设置:
spring.devtools.restart.exclude=static/**,public/**
spring:
devtools:
restart:
exclude: "static/**,public/**"
8.3.3 监控额外的路径
当你对不在classpath上的文件进行修改时,你可能希望你的应用程序被重新启动或重新加载。
8.3.4 禁止重启
如果你不想使用重启功能,你可以通过使用 spring.devtools.restart.enabled 属性来禁用它。
禁止重启:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(MyApplication.class, args);
}
}
8.3.5 使用 trigger file
如果你想在特定时间触发重启,可以使用trigger file:
spring.devtools.restart.trigger-file=.reloadtrigger
spring:
devtools:
restart:
trigger-file: ".reloadtrigger"
这样设置只有当 src/main/resources/.reloadtrigger 被更新时才会重新启动。
8.3.6 自定义重启类加载器
重启功能是通过使用两个classloader实现的,如果这导致了其他的问题,你可能需要自定义类加载器。
默认情况下,你的IDE中任何打开的项目都是用 “restart” 类加载器加载的,而任何常规的 .jar 文件都是用 “base” 类加载器加载。 如果你使用 mvn spring-boot:run 或 gradle bootRun 也是一样:包含了 @SpringBootApplication 的项目用 “restart” 类加载器加载,其他都用 “base” 类加载器。
8.3.7 已知的限制
如果你是要标准的ObjectInputStream来反序列化对象,那么重启功能的效果并不好
8.4 LiveReload
spring-boot-devtools 模块包括一个内嵌的LiveReload服务器,可以用来在资源发生变化时触发浏览器刷新。
如果你不想在应用程序运行时启动LiveReload服务器,你可以将 spring.devtools.livereload.enabled 属性设置为 false 。
8.5 全局设置
你可以通过在 $HOME/.config/spring-boot 目录下添加以下任何文件来配置全局的devtools设置。
1.spring-boot-devtools.properties
2.spring-boot-devtools.yaml
3.spring-boot-devtools.yml
这些文件的属性会影响到我的设备上的所有SpringBoot应用程序
默认情况下,$HOME 是用户的主目录。 要自定义这个位置,请设置 SPRING_DEVTOOLS_HOME 环境变量或 spring.devtools.home 系统属性。
8.5.1 配置文件系统的监控
FileSystemWatcher 的工作方式是以一定的时间间隔轮询类的变化,然后等待一个预定义的安静期,以确保不再有变化。
有时devtools重新启动应用程序时,某些变化并没有反映出来(没有立即生效)
可以尝试增加 spring.devtools.restart.poll-interval
和 spring.devtools.restart.quiet-period
参数到适合你开发环境的值:
spring.devtools.restart.poll-interval=2s
spring.devtools.restart.quiet-period=1s
spring:
devtools:
restart:
poll-interval: "2s"
quiet-period: "1s"
这样设置后受监控的classpath目录现在每2秒轮询一次变化,并保持1秒的安静期以确保没有额外的类变化。
九 打包应用,部署和生产环境
可执行jar可以用于生产环境,由于它们是独立的,非常适合部署到云服务中。
Spring Boot 是一个用于创建独立的、基于 Spring 的生产级应用程序的框架。它通过提供开箱即用的配置和约定来简化应用程序的构建和部署过程,让开发人员能够更专注于业务逻辑的实现。
-
打包:使用 Maven 或 Gradle 这样的构建工具可以将 Spring Boot 应用程序打包成可执行的 JAR 文件或 WAR 文件。这些文件包含了应用程序及其依赖项,并且可以直接在目标环境中运行。
-
部署:部署 Spring Boot 应用程序时有几种选择。最简单的方式是将打包好的 JAR 文件直接上传到服务器并运行。另外,您还可以将 WAR 文件部署到支持 Java Servlet 容器(如 Tomcat、Jetty)的服务器上。
-
生产环境配置:为了使 Spring Boot 应用程序在生产环境中运行得更可靠和高效,需要进行一些额外的配置。例如,您可能需要设置数据库连接、日志记录、缓存策略等。Spring Boot 提供了众多的配置选项,可以通过配置文件(如 application.properties 或 application.yml)或编程方式进行配置。
-
环境变量和配置属性:Spring Boot 允许使用环境变量或配置属性来配置应用程序。通过将配置信息外部化,可以使应用程序更具可移植性和灵活性。
-
监控和管理:Spring Boot 提供了一些用于监控和管理应用程序的功能。例如,Actuator 模块提供了对应用程序运行时信息、健康状态、度量指标等的暴露和监控。
-
安全性:在生产环境中,安全性是一个重要问题。Spring Security 是 Spring 生态系统中负责处理身份验证和授权的模块,您可以使用它来保护您的应用程序,并确保只有经过身份验证和授权的用户能够访问敏感资源。
7.日志记录:在生产环境中,日志记录是非常重要的,可以帮助诊断问题和监控应用程序的运行情况。Spring Boot 默认使用 Logback 作为日志框架,您可以根据需要进行自定义配置。 -
总之,Spring Boot 的设计理念是开箱即用,简化了应用程序的构建和部署过程。通过合适的打包方式、配置文件和额外的配置选项,您可以轻松地将 Spring Boot 应用程序部署到生产环境中,并且通过监控和管理功能来确保应用程序的稳定性和安全性。