spring全家桶系列之spring boot 2.2-基础配置(一)
阅读原文时间:2021年04月22日阅读:1

简介


基于spring boot的整体使用介绍,文档将持续和spring boot发布版本同步更新

spring framework 学习参考 https://docs.spring.io/spring/docs/5.2.0.RELEASE/spring-framework-reference/ 

系统要求


      Spring Boot 2.2.0RELEASE

Build Tool

Version

Maven

3.3+

Gradle

5.x (4.10 is also supported but in a deprecated form)

Name

Servlet Version

Tomcat 9.0

4.0

Jetty 9.4

3.1

Undertow 2.0

4.0

  Spring Boot支持以下嵌入式servlet容器


spring boot 2.2亮点


RSocket是一种用于反应式应用程序的新的网络协议。RSocket是在华盛顿特区举行的SpringOne平台会议上宣布的,是一种新的第7层语言无关的应用网络协议。它是一种基于Reactive Streams背压的双向,多路复用,基于消息的二进制协议。它由Facebook,Netifi和Pivotal等工程师开发,提供Java,JavaScript,C ++和Kotlin等实现。

该协议专门设计用于与Reactive风格应用配合使用,这些应用程序基本上是非阻塞的,并且通常(但不总是)与异步行为配对。使所谓Reactive背压: 即发布者无法向订户发送数据直到该订户已经准备就绪的想法,这是与“异步”的关键区别。

反应式编程(响应式reactive)是Java中高效应用的下一个前沿。但有两个主要障碍 - 数据访问和网络。RSocket旨在解决后一个问题,而R2DBC旨在解决前者问题。

在微服务式应用程序中,HTTP是被广泛用作通信协议。,但HTTP针对的是一个与移动世界截然不同的世界而设计的。

我们有iPhone和Android手机,我们收听通知,所以我们不一定要求一些请求立即得到回复,我们在运动时使用智能手表,它与后端服务器交互,为我们提供统计数据; 我们让Smart助手与后端服务器进行交互。所有这些互动模型都是我们称之为互联体验的一部分。HTTP并不是真的为此设计的。

HTTP的一个重要问题是,它强迫客户端负担起所有责任来处理不同类型的错误上,包括重试逻辑,超时,断路器等。使用Reactive架构构建的应用程序可以提高效率并扩展。

RSocket与HTTP的不同之处在于它定义了四种交互模型:

Fire-and-Forget:优化请求/响应,在不需要响应时非常有用,例如非关键事件日志记录。

请求/响应:当您发送一个请求并收到一个响应时,就像HTTP一样。即使在这里,该协议也具有优于HTTP的优点,因为它是异步和多路复用的。

请求/流:类似于返回集合的请求/响应,集合被回送而不是查询直到完成,因此例如发送银行帐号,用实时的帐户事务流进行响应。


迁移


如果要从早期版本的Spring Boot升级,请查看 项目Wiki上的“迁移指南”, 其中提供了详细的升级说明。另请查看 “发行说明”,了解每个版本的“新的和值得注意的”功能列表。

升级到新功能版本时,某些属性可能已重命名或删除。Spring Boot提供了一种在启动时分析应用程序环境和打印诊断的方法,还可以在运行时临时迁移属性。要启用该功能,请将以下依赖项添加到项目中:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-properties-migrator</artifactId>
    <scope>runtime</scope>
</dependency>

 添加到环境后期的属性(例如使用时 @PropertySource)将不会被考虑在内。

完成迁移后,请确保从项目的依赖项中删除此模块。


项目创建


这里使用idea,创建一个spring boot 项目

下一步创建一个名叫test的项目

下一步选择jar包

 

developer tools 全选没有用过lombok就不要选了

spring devtools 有时启动会打印INFO关于glassfish包依赖不存在,是因为开发工具未能正确查找依赖造成,不影响使用

 参考: https://github.com/spring-projects/spring-boot/issues/9802

web选择

SQL选择

  • 数据库选择先为MySQL Driver (oracle 是没有的需要自己导入)
  • hibernate为:spring data JPA 
  • mybatis为: mybatis FrameWork

最基本的一个spring boot 创建完成


spring boot maven


 官方:https://docs.spring.io/spring-boot/docs/current/maven-plugin/

Spring Boot Maven插件在Maven中提供Spring Boot支持,允许您打包可执行jar或war档案并“就地”运行应用程序。

 概述

repackage配置

1.spring boot配置

模块用作另一个模块的依赖项,则需要为重新打包的模块提供分类器,依赖模块同步打包,但会保留之前的编译的包

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-maven-plugin</artifactId>
                <!-- 程序入口main -->
                <configuration>
                    <mainClass>com.cn.spring.web.WebApplication</mainClass>
                    <layout>JAR</layout>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                        <configuration>
                            <classifier>exec</classifier>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>

2.spring cloud配置

主项目和辅助项目同步重新打包

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>${maven-jar-plugin.version}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                        <phase>package</phase>
                        <configuration>
                            <classifier>task</classifier>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                        <configuration>
                            <classifier>task</classifier>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

start和stop

1.配置测试随机端口

Spring Boot测试集成的一个很好的特性是它可以为Web应用程序分配一个空闲端口。当使用插件的起始目标时,Spring Boot应用程序将单独启动,因此很难将实际端口传递给集成测试本身。

下面的示例展示了如何使用build-helper-plugin实现相同的功能:

<build>

    <plugins>

      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <executions>
          <execution>
            <id>reserve-tomcat-port</id>
            <goals>
              <goal>reserve-network-port</goal>
            </goals>
            <phase>process-resources</phase>
            <configuration>
              <portNames>
                <portName>tomcat.http.port</portName>
              </portNames>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <executions>
          <execution>
            <id>pre-integration-test</id>
            <goals>
              <goal>start</goal>
            </goals>
            <configuration>
              <arguments>
                <argument>--server.port=${tomcat.http.port}</argument>
              </arguments>
            </configuration>
          </execution>
          <execution>
            <id>post-integration-test</id>
            <goals>
              <goal>stop</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <configuration>
          <systemPropertyVariables>
            <test.server.port>${tomcat.http.port}</test.server.port>
          </systemPropertyVariables>
        </configuration>
      </plugin>

    </plugins>

  </build>

2.跳过测试(打包不会添加测试类,但会编译)

<project>
  <properties>
    <skip.it>true</skip.it>
     <start-class>com.xxx.xxx.Application</start-class>
  </properties>

  <build>

    <plugins>

       <plugin>
                <groupId>org.springframework.boot</groupId>
                <!-- 参考: https://docs.spring.io/spring-boot/docs/current/maven-plugin/ -->
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <!--程序入口启动类-->
                    <mainClass>${start-class}</mainClass>
                </configuration>
                <executions>
                    <!-- 打包 -->
                    <!--参考 https://docs.spring.io/spring-boot/docs/current/maven-plugin/examples/repackage-classifier.html-->
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                        <configuration>
                            <classifier>exec</classifier>
                        </configuration>
                    </execution>
                    <!--跳过集成测试-->
                    <execution>
                        <id>pre-integration-test</id>
                        <goals>
                            <goal>start</goal>
                        </goals>
                        <configuration>
                            <skip>${skip.it}</skip>
                        </configuration>
                    </execution>
                    <execution>
                        <id>post-integration-test</id>
                        <goals>
                            <goal>stop</goal>
                        </goals>
                        <configuration>
                            <skip>${skip.it}</skip>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

    </plugins>

  </build>

skip和skipTests区别 (亲测效果一样不知道为什么,都是跳过运行测试,但仍然编译它们)官方使用skip

                    <!-- 将其设置为true跳过运行测试,但仍然编译它们-->
                    <skipTests>${skipTests.it}</skipTests>
                    <!--将其设置为true禁用运行测试和编译测试-->
                    <skip>${skip.it}</skip>

注意:测试类不可为空必须有内容

build-info

                    <execution>
                        <goals>
                            <goal>build-info</goal>
                        </goals>
                        <configuration>
                            <additionalProperties>
                                <encoding.source>UTF-8</encoding.source>
                                <encoding.reporting>UTF-8</encoding.reporting>
                                <java.source>${maven.compiler.source}</java.source>
                                <java.target>${maven.compiler.target}</java.target>
                            </additionalProperties>
                        </configuration>
                    </execution>

 排除依赖

      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <excludes>
            <exclude>
              <groupId>com.foo</groupId>
              <artifactId>bar</artifactId>
            </exclude>
          </excludes>
        </configuration>
      </plugin>

更多参数配置参考官方


appliaction配置文件


默认项目会创建一个appliaction.properties文件 ,使用yaml格式的更直观些。

 一般是这样采用dev开发环境和 prod上线环境 ,切换修改spring.profiles.active


banner.txt为控制台启动图标配置,如果想自己制作 链接

     ┬ ┬┌─┐┬  ┬  ┌─┐  ┬ ┬┌─┐┬─┐┬  ┌┬┐
     ├─┤├┤ │  │  │ │  ││││ │├┬┘│   ││
     ┴ ┴└─┘┴─┘┴─┘└─┘  └┴┘└─┘┴└─┴─┘─┴┘

       spring-boot: ${spring-boot.version}

application.yml

注意:如果使用spring-data-starter-jdbc,spring-data-starter-redis 等,spring boot2.2jpa不配置将无法启动,

repositories参考Repository类,请勿使用spring.main.allow-bean-definition-overriding=true

  #spring data
  data:
    jdbc:
      repositories:
        enabled: false
    redis:
      repositories:
        enabled: false

或指定basePackages例如:

@EnableJpaRepositories(basePackages = "")
@EnableJdbcRepositories(basePackages = "")  //如果无直接操作jdbc的话关闭
@EnableRedisRepositories(basePackages = "") //如果无直接操作redis的话关闭

大部分为默认配置好的不需要配置

spring:
  profiles:
    active: dev
  #数据库连接池:使用hikari,spring boot 提供默认配置,其它连接池需配置
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    #使用默认值参考: HikariConfig类或github上的HikariCP https://github.com/brettwooldridge/HikariCP
    #maximum-pool-size参考: https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing
  transaction:
    #事务等待2分钟超时
    default-timeout: PT2M
    #提交的事务失败回滚
    rollback-on-commit-failure: true
  #文件限制
  servlet:
    multipart:
      max-file-size: 100MB
      max-request-size: 100MB
#tocmat
server:
  servlet:
    context-path: /
    session:
      #1小时
      timeout: PT1H
  tomcat:
    #主要是为了识别代理ip地址
    #从中提取远程 ip 的 http 标头的名称
    remote-ip-header: X-FORWARDED-FOR
    #用于识别协议(HTTP 或 HTTPS)
    protocol-header: X-Forwarded-Proto

application.yml添加hibernate配置

#hibernate JPA
  jpa:
    database: MYSQL
    #在启动时初始化架构
    generate-ddl: true
    #注册OpenEntityManagerInViewInterceptor拦截器
    open-in-view: true
    hibernate:
      ddl-auto: update
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL8Dialect
        current_session_context_class: org.springframework.orm.hibernate5.SpringSessionContext
        enable_lazy_load_no_trans: true
        #使用@Transient注解操作异常问题解决
        event:
          merge:
            entity_copy_observer: allow

  mybatis 参考:链接


 application-dev.yml和application-prod.yml

差不多一样就是地址 用户名 密码会变动

#测试环境
spring:
  config:
    #名称可以在application.yml 切换
    name: dev
  datasource:
    url: 地址
    username: 用户名
    password: 密码
    driverClassName: com.mysql.cj.jdbc.Driver
    sql-script-encoding: UTF-8
server:
  port: 80

Main主类


@SpringBootApplication
//开启事务
@EnableTransactionManagement
public class WebApplication {
    public static void main(String[] args) {
        SpringApplication.run(WebApplication.class, args);
    }
}

默认为 @ComponentScan(basePackageClasses = WebApplication.class) 无需配置

1. 默认组件的扫描

默认会使用basePackageClasses基于WebApplication类所在包进行组件扫描

@ComponentScan(basePackageClasses = WebApplication.class)

等同于WebApplication在com.cn.demo包下等于@ComponentScan(basePackages ="com.cn.demo")

2.需要重新定义扫描的组件

 1.移动WebApplication到com.cn包下

 2.使用@ComponentScan(basePackages ="xxx.xxx.xxx")

  •   如果使用了basePackages了例如:使用hibernate进行数据访问层的注入还需要配置basePackages
  •   例如@EnableJpaRepositories(basePackages ="xxx.xxx.xxx")不配置的话会注入失败。

建议移动WebApplication


配置完成可以启动


下一篇:spring boot基础功能