侧边栏壁纸
博主头像
liveJQ博主等级

沒有乐趣,何来开始

  • 累计撰写 146 篇文章
  • 累计创建 60 个标签
  • 累计收到 2 条评论

揭开Spring Boot的神秘面纱之配置篇

liveJQ
2019-05-20 / 0 评论 / 0 点赞 / 996 阅读 / 13,300 字 / 正在检测是否收录...
广告 广告

介绍Spring Boot

Spring Boot可以轻松创建可以运行的独立的,生产级的基于Spring的应用程序。我们对Spring平台和第三方库进行了一种封装,其允许内嵌Tomcat服务器,可以轻松上手。

使用yml格式配置文件,大多数Spring Boot应用程序只需要很少的Spring配置。您可以使用Spring Boot创建可以使用java -jar或更传统的war部署启动的Java应用程序。

Spring Boot 可以做到开箱即用,为所有Spring开发提供从根本上更快且可广泛访问的入门体验。

Spring Boot不需要任何特殊工具集成,因此您可以使用任何IDE或文本编辑器。此外,Spring Boot应用程序没有什么特别之处,因此您可以像运行任何其他Java程序一样使用JUnit4.12(必须4.12版本以上)、SpringBootTest(是对JUnit的一个封装)或在main方法中运行和调试Spring Boot应用程序。

配置要求

Spring Boot版本

当前Spring Boot 各版本(一般选带GA的):

20190520_spring_boot_release.png

Spring Boot 2.1.5.RELEASE需要Java 8,并且与Java 11兼容(包括在内)。还需要Spring Framework 5.1.7.RELEASE或更高版本。

构建工具版本

为以下构建工具提供了显式构建支持:

  • Maven 3.3+
  • Gradle 4.4+

对应的Servlet容器版本

Spring Boot支持以下嵌入式Servlet容器:

Name => Servlet Version

  • Tomcat 9.0 => 4.0
  • Jetty 9.4 => 3.1
  • Undertow 2.0 => 4.0

可以将Spring Boot应用程序部署到任何Servlet 3.1+兼容容器,Tomcat8.5.4x就可以了。

Maven配置

pom.xml项目对象模型


<?xml version =“1.0” encoding =“UTF-8”?> 
<project  xmlns = “http://maven.apache.org/POM/4.0.0”  xmlns:xsi = “http://www.w3 .org / 2001 / XMLSchema-instance“ 
    xsi:schemaLocation = ”http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd“ > 
    <modelVersion> 4.0.0 </ modelVersion> 

    <groupId> com.example </ groupId> 
    <artifactId> myproject </ artifactId> 
    <version> 0.0.1-SNAPSHOT </ version> 

    <! - 从Spring Boot继承默认值 - - > 
    <parent> 
        <groupId> org.springframework.boot </ groupId>
        <artifactId> spring-boot-starter-parent </ artifactId> 
        <version> 2.1.5.RELEASE </ version> 
<!--继承Starter Parent后,只需要在此依赖项上指定Spring Boot版本号。如果导入其他启动器,则可以省略版本号的配置,maven会自动导入符合2.1.5.RELEASE版本的各种依赖-->
    </ parent> 

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>

    <! - 添加Web应用程序的典型依赖项 - > 
    <dependencies> 
        <dependency> 
            <groupId> org.springframework.boot </ groupId> 
            <artifactId> spring-boot-starter-web </ artifactId> 
        </ dependency> 
    </ dependencies> 

    <! - 可以将项目打包为可执行 jar 的一个Maven插件- > 
    <build> 
        < plugins> 
            <plugin> 
                <groupId> org.springframework.boot </ groupId> 
                <artifactId>spring-boot-maven-plugin </ artifactId> 
            </ plugin> 
        </ plugins>
    </ build> 

</ project>

通过上面继承spring boot的默认设置,您还可以通过覆盖自己项目中的属性来覆盖单个依赖项。例如,要升级到另一个Spring Data版本系列,您需要将以下内容添加到pom.xml:

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

获取支持的属性列表(继承自 spring boot 默认配置)

如果您不想使用spring-boot-starter-parent,您仍然可以通过使用scope=import依赖项来保持依赖项管理


<dependencyManagement> 
	<dependencies> 
		<dependency> 
			<! - 从Spring Boot导入依赖关系管理 - > 
			<groupId> org.springframework.boot </ groupId> 
	<!-- 核心(这个其实就是包含配置spring boot项目所需要的各种依赖信息,与上面parent不同的是,这里只是提供依赖信息,并没有引入,要想覆盖其中包含的某个依赖信息的版本,需在这个声明之前声明,如下:) -->
			<artifactId>spring-boot-dependencies</ artifactId> 
			<version> 2.1 .5.RELEASE </ version> 
			<type> pom </ type> 
			<scope> import </ scope> 
		</ dependency> 
	</ dependencies> 
</ dependencyManagement>

<dependencyManagement> 
	<dependencies> 
		<! - 覆盖Spring Boot提供的Spring Data版本系列 - > 
		<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.5.RELEASE </ version> 
			<type> pom</ type> 
			<scope> import </ scope> 
		</ dependency> 
	</ dependencies> 
</ dependencyManagement>

spring-boot-starter-*

类似spring-boot-starter-*的被称为启动器,是一组方便的依赖关系描述符,所有官方首发都遵循类似的命名模式。第三方启动者不应该开头spring-boot,因为它是为官方Spring Boot工件保留的。相反,第三方启动器通常以项目名称开头。

表13.1。Spring Boot应用程序启动器

名称描述POM

spring-boot-starter

核心启动器,包括自动配置支持,日志记录和YAML

POM

spring-boot-starter-activemq

使用Apache ActiveMQ进行JMS消息传递的入门者

POM

spring-boot-starter-amqp

使用Spring AMQP和Rabbit MQ的入门者

POM

spring-boot-starter-aop

使用Spring AOP和AspectJ进行面向方面编程的入门者

POM

spring-boot-starter-artemis

使用Apache Artemis进行JMS消息传递的入门者

POM

spring-boot-starter-batch

使用Spring Batch的入门者

POM

spring-boot-starter-cache

使用Spring Framework的缓存支持的初学者

POM

spring-boot-starter-cloud-connectors

使用Spring Cloud Connectors的初学者简化了Cloud Foundry和Heroku等云平台中的服务连接

POM

spring-boot-starter-data-cassandra

使用Cassandra分布式数据库和Spring Data Cassandra的入门者

POM

spring-boot-starter-data-cassandra-reactive

使用Cassandra分布式数据库和Spring Data Cassandra Reactive的入门者

POM

spring-boot-starter-data-couchbase

使用Couchbase面向文档的数据库和Spring Data Couchbase的入门者

POM

spring-boot-starter-data-couchbase-reactive

使用Couchbase面向文档的数据库和Spring Data Couchbase Reactive的入门者

POM

spring-boot-starter-data-elasticsearch

使用Elasticsearch搜索和分析引擎以及Spring Data Elasticsearch的初学者

POM

spring-boot-starter-data-jdbc

使用Spring Data JDBC的入门者

POM

spring-boot-starter-data-jpa

将Spring Data JPA与Hibernate一起使用的初学者

POM

spring-boot-starter-data-ldap

使用Spring Data LDAP的入门者

POM

spring-boot-starter-data-mongodb

使用MongoDB面向文档的数据库和Spring Data MongoDB的初学者

POM

spring-boot-starter-data-mongodb-reactive

使用MongoDB面向文档的数据库和Spring Data MongoDB Reactive的入门者

POM

spring-boot-starter-data-neo4j

使用Neo4j图形数据库和Spring Data Neo4j的入门者

POM

spring-boot-starter-data-redis

在Spring Data Redis和Lettuce客户端上使用Redis键值数据存储的初学者

POM

spring-boot-starter-data-redis-reactive

使用带有Spring Data Redis被动的Redis键值数据存储和Lettuce客户端的入门者

POM

spring-boot-starter-data-rest

使用Spring Data REST通过REST公开Spring Data存储库的入门者

POM

spring-boot-starter-data-solr

在Spring Data Solr中使用Apache Solr搜索平台的初学者

POM

spring-boot-starter-freemarker

使用FreeMarker视图构建MVC Web应用程序的入门者

POM

spring-boot-starter-groovy-templates

使用Groovy模板视图构建MVC Web应用程序的入门者

POM

spring-boot-starter-hateoas

使用Spring MVC和Spring HATEOAS构建基于超媒体的RESTful Web应用程序的入门者

POM

spring-boot-starter-integration

使用Spring Integration的入门者

POM

spring-boot-starter-jdbc

将JDBC与HikariCP连接池一起使用的入门者

POM

spring-boot-starter-jersey

使用JAX-RS和Jersey构建RESTful Web应用程序的初学者。替代spring-boot-starter-web

POM

spring-boot-starter-jooq

使用jOOQ访问SQL数据库的初学者。替代spring-boot-starter-data-jpaspring-boot-starter-jdbc

POM

spring-boot-starter-json

阅读和写作json的初学者

POM

spring-boot-starter-jta-atomikos

使用Atomikos进行JTA交易的入门者

POM

spring-boot-starter-jta-bitronix

使用Bitronix进行JTA事务的入门者

POM

spring-boot-starter-mail

使用Java Mail和Spring Framework的电子邮件发送支持的入门者

POM

spring-boot-starter-mustache

使用Mustache视图构建Web应用程序的入门者

POM

spring-boot-starter-oauth2-client

使用Spring Security的OAuth2 / OpenID Connect客户端功能的入门者

POM

spring-boot-starter-oauth2-resource-server

使用Spring Security的OAuth2资源服务器功能的入门者

POM

spring-boot-starter-quartz

使用Quartz调度程序的入门者

POM

spring-boot-starter-security

使用Spring Security的入门者

POM

spring-boot-starter-test

使用JUnit,Hamcrest和Mockito等库来测试Spring Boot应用程序的初学者

POM

spring-boot-starter-thymeleaf

使用Thymeleaf视图构建MVC Web应用程序的入门者

POM

spring-boot-starter-validation

使用Java Bean Validation和Hibernate Validator的初学者

POM

spring-boot-starter-web

使用Spring MVC构建Web(包括RESTful)应用程序的入门者。使用Tomcat作为默认嵌入式容器

POM

spring-boot-starter-web-services

使用Spring Web Services的入门者

POM

spring-boot-starter-webflux

使用Spring Framework的Reactive Web支持构建WebFlux应用程序的初学者

POM

spring-boot-starter-websocket

使用Spring Framework的WebSocket支持构建WebSocket应用程序的初学者

POM

表13.3。Spring Boot技术首发

名称描述POM

spring-boot-starter-jetty

使用Jetty作为嵌入式servlet容器的入门。替代spring-boot-starter-tomcat

POM

spring-boot-starter-log4j2

使用Log4j2进行日志记录的入门。替代spring-boot-starter-logging

POM

spring-boot-starter-logging

使用Logback进行日志记录的入门。默认日志启动器

POM

spring-boot-starter-reactor-netty

使用Reactor Netty作为嵌入式响应式HTTP服务器的入门者。

POM

spring-boot-starter-tomcat

使用Tomcat作为嵌入式servlet容器的入门者。使用的默认servlet容器启动器spring-boot-starter-web

POM

spring-boot-starter-undertow

使用Undertow作为嵌入式servlet容器的入门者。替代spring-boot-starter-tomcat

POM

## 开始程序

@SpringBootApplication

通常不鼓励使用“默认包”,应该避免使用。这可能会导致使用了Spring启动应用程序的特殊问题@ComponentScan,@EntityScan或@SpringBootApplication注解,因为每个class都是从jar中被读取的。

建议遵循Java推荐的包命名约定并使用反向域名(例如,com.example.project)

通常建议您将主应用程序类放在其他类之上的根包中:

20190520_pom_application.png


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);
	}

}

该@SpringBootApplication注解往往放在你的主类,它隐含地定义为某些项目基础的“搜索包”。例如,如果您正在编写JPA应用程序,@SpringBootApplication则使用注解annotation的类的包来搜索@Entity项目。使用根包还允许组件扫描仅应用于您的项目。

如果您不想使用@SpringBootApplication,它导入的@EnableAutoConfiguration 和@ComponentScan注释会定义该行为,因此您也可以使用它们来替代。

配置文件或配置类

@Configuration 定义配置类

@import 用于导入额外的配置类

@ComponentScan 自动获取所有Spring组件,包括 @Configuration类

@importResource 加载XML配置文件

@SpringBootApplication或@EnableAutoConfiguration(只能选一个) Spring Boot自动配置尝试根据您添加的jar依赖项自动配置Spring应用程序。例如,如果HSQLDB 在您的类路径上,并且您尚未手动配置任何数据库连接bean,则Spring Boot会自动配置内存数据库。

自动配置是非侵入性的。在任何时候,您都可以开始定义自己的配置以替换自动配置的特定部分。例如,如果添加自己的DataSourcebean,则默认的嵌入式数据库支持会退回。

  • 禁用特定的自动配置类

import org.springframework.boot.autoconfigure。*;
import org.springframework.boot.autoconfigure.jdbc。*;
import org.springframework.context.annotation。*;

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

Spring Beans和依赖注入

@Autowired依赖注入

以下示例显示了一个@Service使用构造函数注入来获取所需RiskAssessorbean的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(spring framework中可以根据配置文件通过构造方法或setter方法进行依赖注入,可能是spring boot这里对此进行了增强吧:T)

各种常用@*组件

@SpringBootApplication注释是相当于使用@Configuration, @EnableAutoConfiguration以及@ComponentScan

  • @EnableAutoConfiguration:启用Spring Boot的自动配置机制

  • @ComponentScan:@Component在应用程序所在的包上启用扫描

  • @Configuration:允许在上下文中注册额外的bean或导入其他配置类

在根包中定位应用程序类,则可以添加@ComponentScan(@SpringBootApplication已包含)不带任何参数的代码。您的所有应用程序组件都将被注册为spring bean:

  • @Component, @Service, @Controller, @Repository是spring注解,注解后可以被spring框架所扫描并注入到spring容器来进行管理
  • @Component是通用注解,其他三个注解是这个注解的拓展,并且具有了特定的功能
  • @Repository注解在持久层中,具有将数据库操作抛出的原生异常翻译转化为spring的持久层异常的功能。
  • @Controller层是spring-mvc的注解,具有将请求进行转发,重定向的功能。
  • @Service层是业务逻辑层注解,这个注解只是标注该类处于业务逻辑层。

用这些注解对应用进行分层之后,就能将请求处理,义务逻辑处理,数据库操作处理分离出来,为代码解耦,也方便了以后项目的维护和开发。

可以不使用@SpringBootApplication,而可以自定义:


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.yml配置

一般默认生成的项目配置文件为application.properties,其使用key:value的方式进行配置,但如今比较流行application.yml的yml文件配置,因其使用分层、缩进的格式,提高了配置文件的可读性。如:


server: 
	port: 8080

系统运行时,读取配置文件的的顺序一般为:

  1. 根目录下的config目录中的application.yml
  2. 根目录下的application.yml
  3. resources目录下的config目录中的application.yml
  4. resources目录下的application.yml

注意:如果两个地方都配置了配置文件,其中后面的配置不会覆盖前面的配置信息,系统会先读取前面的配置信息,然后再读取后面的配置信息(其中忽略掉已读取过的配置信息,也就是说如果前面的配置文件中没有配置端口server.port,则若后面的配置文件中配置了server.port=8081,则会生效(8080为默认端口))

运行程序

打包成jar运行

将应用程序打包为jar并使用嵌入式HTTP服务器的最大优势之一是,您可以像运行任何其他应用程序一样运行应用程序。调试Spring Boot应用程序也很容易。您不需要任何特殊的IDE插件或扩展。

如果使用Spring Boot Maven或Gradle插件创建可执行jar,则可以使用运行应用程序java -jar,如以下示例所示:

  • java -jar target / myapplication-0.0.1-SNAPSHOT.jar

使用Maven运行

配置系统环境变量:

  • export MAVEN_OPTS = -Xmx1024m

快速编译和运行应用程序:

  • mvn spring-boot:run

热插拔

可以使用JRebel,要加入spring-boot-devtools模块


<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-devtools</artifactId>
		<optional>true</optional>
<!-- 依赖项标记为Maven中的可选项 是防止devtools过渡传递到项目的其他模块-->
	</dependency>
</dependencies>

运行完全打包的应用程序时会自动禁用开发人员工具。如果您的应用程序是从java -jar特殊的类加载器启动或启动的,那么它将被视为“生产应用程序”。如果这不适用于您(即,如果您从容器运行应用程序,也就是已经打包好了,不是开发状态了),请考虑排除devtools或设置-Dspring.devtools.restart.enabled=false系统属性。

缓存

Spring Boot支持的几个库使用缓存来提高性能。例如,模板引擎缓存已编译的模板以避免重复解析模板文件。此外,Spring MVC可以在提供静态资源时为响应添加HTTP缓存标头。虽然缓存在生产中非常有用,但在开发过程中可能会适得其反,使您无法看到刚刚在应用程序中进行的更改。因此,spring-boot-devtools默认禁用缓存选项。

缓存选项通常由application.properties文件中的设置配置。例如,Thymeleaf提供spring.thymeleaf.cache设置是否缓存。该spring-boot-devtools模块不需要手动设置这些属性,而是自动应用合理的这些配置。

触发重启restart和快速重装reload

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

spring.devtools.restart.exclude=static/ **,public/ **

如果要保留这些默认值并添加其他排除项,请改用该 spring.devtools.restart.additional-exclude属性。(自定义添加重启目录可以设置:spring.devtools.restart.additional-paths)

该spring-boot-devtools模块包括一个嵌入式LiveReload服务器,可用于在更改资源时触发浏览器刷新。LiveReload浏览器扩展程序可从livereload.com免费用于Chrome,Firefox和Safari 。

如果您不想在应用程序运行时启动LiveReload服务器,则可以将spring.devtools.livereload.enabled属性设置为false

若喜欢仅在特定时间触发重新启动,可以使用“触发器文件”。这是一个特殊文件,当您想要实际触发重新启动检查时,必须对其进行修改。可以设置
spring.devtools.restart.trigger-file属性设置为触发器文件的路径

全局设置

您可以通过添加一个文件名为配置全局devtools设置 .spring-boot-devtools.properties到你的$HOME文件夹(注意:文件名开头“.”)。添加到此文件的任何属性都适用于计算机上使用devtools的所有 Spring Boot应用程序。例如,要将restart配置为始终使用 触发器文件,您需要添加以下属性:
〜/.spring-boot-devtools.properties文件中:
spring.devtools.restart.trigger-file=文件路径

激活的配置文件.spring-boot-devtools.properties不会影响特定于配置文件的配置文件的加载

禁用devtools

设置application.properties中的spring.devtools.restart.enabled=false(这样做仍会初始化重新启动的类加载器,但它不会监视文件更改)。要完全禁用则可以:


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

评论区