欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring Boot 学习笔记

程序员文章站 2022-07-14 11:01:19
...

Srping boot简单介绍

Spring boot 提供了很多“starter”,它让我们可以非常方便的把jar包添加到类路径。
spring-boot-starter-parent是一个特殊的启动器,提供了有用的mvn默认配置。另外,还提供了依赖管理的功能,因此添加依赖的时候可以不用写version。
其它的一些starter提供某一个类型的功能,如果使用了spring-boot-starter-web,那么spring boot会假定这是一个web应用程序,并添加其相应的jar包(etc. hibernate、spring-mvc、jakson等)。
使用命令查看依赖图
mvn dependency:tree

第一个类:

@RestController
@EnableAutoConfiguration
public class Example {

    @RequestMapping("/")
    String home() {
        return "Hello World!";
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Example.class, args);
    }

}

@RestController and @RequestMapping annotations
@RestController:指定class扮演的角色,在这里是指web @Controller,因此当接受到web 请求的时候,Spring 就会对该类进行相应处理。
@RequestMapping:提供路由信息,Spring将与之匹配的HTTP请求映射到其注解的方法。之后,@RestController告诉Spring将渲染结果返回给调用者。

@EnableAutoConfiguration:Spring Boot会根据项目添加的jar包,进行spring相关配置。
Auto-configuration被设计为根据 starter进行工作,但是,如果我们使用非starter包,Spinrg Boot依然也可以对其进行良好的自动配置功能。

main方法:就是一个程序入口点,通过调用run方法委托Spring boot的SpringApplication类进行。SpringApplication会启动程序、自动配置(例如tomcat server)。Example.class告诉Spring boot 主程序是谁。

编译程序、生成包,要在pom文件中加入:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

使用命令打包:
mvn package

Using Spring Boot

构建工具

推荐使用支持依赖管理,并且可以使用maven central中组件的构建系统:maven或gradle。其它系统也可以使用,但是支持效果不是很好。

dependency management

每一个Spring boot 发行版都提供了其支持的依赖项列表。因为我们提供的依赖包,不需要指定使用的版本。

maven

应用程序会从spring-boot-starter-parent项目继承一些默认值。parent项目提供了以下功能:
1.默认JAVA1.6编译器
2.utf8编码的源码
3.智能化的资源过滤
4.智能化的插件配置

使用Spring boot ,通常是继承parent pom:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>SPRING BOOT RELEASE VERSION</version>
</parent>

通过在pom文件中使用以下配置,来覆盖默认的版本配置。

<properties>
    <spring-data-releasetrain.version>Fowler-SR2</spring-data-releasetrain.version>
</proper

如果想使用显示的方式进行maven管理,或者公司有自己的parent依赖要求。也可以不继承parent-starter来使用Spring Boot。详情参考Using Spring Boot without the parent POM

为了兼容性Spring boot默认使用较低的java版本。如果想使用自己的java版本,可以这样做:

<properties>
    <java.version>1.8</java.version>
</properties>

starter

starter是一组很方便使用的依赖描述符。使我们可以获取一站式服务。例如:如果我们需要spring-jpa来访问数据库,那么只需要在pom中引入spring-boot-starter-data-jpa,而不需要将相关的jar包下载复制等繁琐的操作。

代码结构

默认包的使用default package

如果不把类包含在package中,会被默认为在"default package"中。这种情况是要注意避免的,因为“default package”会导致Spring Boot中 @ComponentSacn ,@EntityScan or @SpringBootApplication注解扫描所有的java class,包括jar包。(推荐使用倒写的域名)

推荐的代码结构

将程序的main class 放在程序包的根路径下(称为root package),@EnableAutoConfiguration通常作用在主类上,隐式的标识包搜索的基位置。例如:在编写JPA应用程序的时候@EnableAutoConfiguration注释类的包将用于搜索@Entity项目。
使用root package,我们可用使用@ComponentScan注解而不需要制定Base package属性。如果主类位于root package,也可以使用@SpringBootApplication注释main class。

配置类

Spring Boot支持基于Java的配置。虽然可以用XML调用SpringApplication.run(),但我们通常建议您的主要来源是@Configuration类。通常,用于将main class 定义为 主@Configuration。

导入其他配置类

需要把所有的@Configuration放到一个类中。 @Import注释可用于导入其他配置类。或者,可以使用@ComponentScan自动获取所有Spring组件,包括@Configuration类。

导入XML配置

如果必须要使用基于XML的配置,建议仍以@Configuration类开头。然后您可以使用@ImportResource注解来加载XML配置文件。

Auto-configuration

Spring Boot自动配置会尝试根据添加的jar依赖项,自动配置应用程序。例如,如果类路径中HSQLDB,并且您没有手动配置任何数据库连接Bean,那么我们将自动配置一个内存数据库。

需要通过将@EnableAutoConfiguration或@SpringBootApplication注释添加到其中一个@Configuration类来选择自动配置。

[Tip]
您应该只添加一个@EnableAutoConfiguration注释。我们通常建议您将其添加到您的主要@Configuration类。

逐渐更换自动配置

在任何位置都可以使用自定义配置来覆盖掉自动配置。例如,如果添加了自己的DataSource bean,则默认的嵌入式数据库支持将会失效。

如果想知道自动配置了什么东西。使用--debug开关启动程序。就会启用选择核心记录器的调试日志,并将自动配置报告打印到控制台。

禁用特定的自动配置

如果您发现正在应用您不需要的特定自动配置类,则可以使用@EnableAutoConfiguration的exclude属性来禁用它们。

@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})

public class MyConfiguration {
}

如果类不在类路径中,可以用注解的excludeName属性,并指定其完全限定名。 最后,还可以通过spring.autoconfigure.exclude属性来控制自动配置类的列表。

Spring Beans and dependency injection

我们可以使用所有Spring 框架支持的技术,定义Bean和其依赖注入关系。为了简单、方便,我们通常使用@ComponentScan查找Bean,结合@Autowired构造函数注入,来实现快速高效的依赖注入。
使用root package形式的代码结构,我们使用不带任何参数的@ComponentScan注解,就可以将(@Component,@Service,@Repository,@Controller等)所有应用程序组件自动注册为Spring Bean。

@SpringBootApplication

使用Spring Boot的推荐代码结构,main class都会使用@Configuration, @EnableAutoConfiguration and @ComponentScan三个注解。现在Spring boot 提供了@SpringBootApplication注解用于和其三个注解进行等价替换。

热插拔

由于Spring Boot应用程序只是普通的Java应用程序,所以JVM热插拔应该是开箱即用的。 JVM热插拔在某种程度上受限于它可以替换的字节码,为了获得更完整的解决方案,可以使用JRebel或Spring Loaded项目。 spring-boot-devtools模块还包括对快速应用程序重新启动的支持。

开发者工具

详情参考:https://docs.spring.io/spring-boot/docs/1.5.8.RELEASE/reference/htmlsingle/#using-boot-devtools
Spring Boot包含一组额外的工具,可以使应用程序开发体验更愉快。spring-boot-devtools模块可以包含在任何项目中以提供额外的开发时间功能。 要包含devtools支持,只需将模块依赖关系添加到您的版本:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

属性默认值

Spring boot支持一些库使用缓存机制来提高性能(如:模板、HTTP等缓存)。但是在调试、开发环节则会使我们的代码更改不能立即生效。spring-boot-devtools会禁用缓存选项。

自动重启

任何类路径下文件的更新、修改都会使spring-boot-devtools 重启应用程序。

重新启动vs重新加载
Spring Boot提供的重启技术通过使用两个类加载器来工作。不改变的类(例如来自第三方jar的类)被加载到 基类加载器中。您正在开发的类将加载到重启 类加载器中。当应用程序重新启动时,重启 classloader被丢弃,并创建一个新的。这种方法意味着应用程序重新启动通常比“冷启动”快得多,因为基类加载器已经可用并且已经被填充了。

排除资源

某些资源不一定需要在更改时触发重新启动。例如,Thymeleaf模板可以就地编辑。默认情况下,改变资源/META-INF/maven,/META-INF/resources,/resources,/static,/public或 /templates不会触发重新启动,但会引发 现场重装。如果你想自定义这些排除,你可以使用该spring.devtools.restart.exclude属性。例如,要仅排除 /static,/public您将设置以下内容:
spring.devtools.restart.exclude=static/**,public/**

监视额外资源

如果想让不在类路径里的资源在更改的时候也能触发重启,配置spring.devtools.restart.additional-paths属性来制定。
可以使用上述的spring.devtools.restart.exclude属性控制,在额外资源路径下面 触发restart还是reload。

禁用重启

如果您不想使用重新启动功能,则可以使用该spring.devtools.restart.enabled属性将其禁用 。在大多数情况下,你可以在你的设置 application.properties(这将仍然初始化重启类加载器,但它不会监视文件的变化)。
如果您需要完全禁用重新启动支持,例如,因为它不适用于特定的库,则需要在System调用SpringApplication.run(…​)之前设置属性 。例如:

public static void main(String[] args) {
    System.setProperty("spring.devtools.restart.enabled", "false");
    SpringApplication.run(MyApp.class, args);
}

对于自动重启功能还有使用触发文件、定制restart classloader、LiveReload、全局设置、远程应用程序等,可参考官方文档。

应用程序打包

可执行的jar 程序可用于生产部署。 由于它们是独立的,因此它们也非常适合基于云的部署。
对于额外的“生产就绪”功能,如健康,审计和度量REST或JMX端点; 考虑使用spring-boot-actuator

SpringApplication

SpringApplication类提供了一个方便的方法来引导从main()方法启动的Spring应用程序。 在很多情况下,你可以委托给静态的SpringApplication.run方法:

public static void main(String[] args) {
    SpringApplication.run(MySpringConfiguration.class, args);
}

启动失败

如果程序无法启动,已注册的FailureAnalyzers会提供错误消息和具体操作来解决问题。 我们可以定义自己的FailureAnalyzers:howto-failure-analyzer

自定义横幅

1.通过在classpath 下添加banner.txt 文件。

自定义SpringApplication

如果默认的SpringApplication不符合自己的要求,我们可以创建一个本地实例,修改我们想要使用、更改的配置。例如:关闭横幅

public static void main(String[] args) {
    SpringApplication app = new SpringApplication(MySpringConfiguration.class);
    app.setBannerMode(Banner.Mode.OFF);
    app.run(args);
}

传递给SpringApplication的构造函数参数是spring bean的配置源。 在大多数情况下,这些将是对@Configuration类的引用,但也可以是对XML配置或应扫描的包的引用。
也可以使用application.properties文件来配置SpringApplication。 有关详细信息参考:外部化配置

流式构建API

如下:详情可参考:SpringApplicationBuilder Javadoc

new SpringApplicationBuilder()
        .sources(Parent.class)
        .child(Application.class)
        .bannerMode(Banner.Mode.OFF)
        .run(args);

应用程序事件和侦听器

除了常用Spring框架事件,比如ContextRefreshedEvent,SpringApplication,Spring Boot还会发送一些其它应用程序事件。

[注意]
有些事件实际上是在创建ApplicationContext之前触发的,因此您不能将这些侦听器注册为@Bean。您可以通过SpringApplication.addListeners(...)或SpringApplicationBuilder.listeners(...)方法注册它们。
如果您希望自动注册这些监听器而不管创建应用程序的方式如何,您可以将META-INF / spring.factories文件添加到您的项目中,并使用org.springframework.context.ApplicationListener项来引用您的监听器。
org.springframework.context.ApplicationListener = com.example.project.MyListener

事件会按照以下顺序发送,就像您的应用程序运行一样:

1、ApplicationStartingEvent:在运行开始时发送,但在除监听器和初始化器注册之外的任何处理之前发送。
2、ApplicationEnvironmentPreparedEvent:当在上下文中使用的环境是已知的,但是在创建上下文之前发送。
3、ApplicationPreparedEvent:在刷新开始之前发送,但是在bean定义加载之后。
4、ApplicationReadyEvent:在刷新之后发送,并且已经处理了任何相关的回调以指示应用程序已准备好为请求提供服务。
5、ApplicationFailedEvent:如果启动时出现异常,则发送

[Tip]
通常不需要使用应用程序事件,但要知道它们的存在。Spring Boot内部,使用事件来处理各种任务。

Web 环境

SpringApplication将会尝试为你创建正确类型的ApplicationContext。 默认情况下,使用AnnotationConfigApplicationContext或AnnotationConfigEmbeddedWebApplicationContext,具体取决于您是否正在开发Web应用程序。

用于确定“Web环境”的算法相当简单(基于程序中存在的几个类)。 如果您需要覆盖默认值,可以使用setWebEnvironment(boolean webEnvironment)。

也可以通过调用setApplicationContextClass(...)来完全控制ApplicationContext的类型。

[Tip]
在JUnit测试中使用SpringApplication时,通常需要调用setWebEnvironment(false)

访问应用程序参数

@Component
public class MyBean {

    @Autowired
    public MyBean(ApplicationArguments args) {
        boolean debug = args.containsOption("debug");
        List<String> files = args.getNonOptionArgs();
        // if run with "--debug logfile.txt" debug=true, files=["logfile.txt"]
    }

}

使用ApplicationRunner or CommandLineRunner

如果你需要在SpringApplication启动后运行一些特定的代码,你可以实现ApplicationRunner或者CommandLineRunner接口。 两个接口都以相同的方式工作,并提供了一个将在SpringApplication.run(...)完成之前调用的单一运行方法。
CommandLineRunner接口作为一个简单的字符串数组提供对应用程序参数的访问,而ApplicationRunner使用上面讨论的ApplicationArguments接口。

[Tip]
如果定义了多个CommandLineRunner或ApplicationRunner bean,则可以额外实现org.springframework.core.Ordered接口或使用org.springframework.core.annotation.Order注释,并且必须按特定顺序调用它们。

管理员功能

通过指定spring.application.admin.enabled属性,可以为应用程序启用与管理相关的功能。 这会导致在MBeanServer平台上暴露SpringApplicationAdminMXBean。 您可以使用此功能远程管理您的Spring Boot应用程序。

外部配置

Externalized Configuration
Spring boot支持外部化配置,因此可以根据具体生产环境来配置自己的应用程序。可以使用配置文件、环境变量、命令行参数、来进行配置。可以使用@Value注解将属性值直接注入Bean,使用Spring的 ?环境抽象? 或者@ConfigurationProperties注解的结构化对象。

引用外部属性的例子。

import org.springframework.stereotype.*
import org.springframework.beans.factory.annotation.*

@Component
public class MyBean {

    @Value("${name}")
    private String name;

    // ...

}

属性特征一般写在classpath下的application.properties文件。

配置随机值

my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.uuid=${random.uuid}

命令行参数外部属性

命令行以--server.port=9000打头即可。该类型的参数优先级高于配置文件。默认情况下,spring boot会将其添加到应用程序环境中。

应用程序的属性文件

1.当前jar文件子目录的/config文件
2.当前jar的跟目录
3.类路径下/config中的文件

spring:
profiles:
active: dev