1、Spring Boot 2.0 更新了什么

  • 基础环境升级

    Spring Boot 2.0 要求 Java 8 作为最低版本。
    Spring Boot 2.0 通过了在 JDK 9 下的测试,可以在 JDK 9 下正常运行,同时 Spring Boot 2.0 宣布不再⽀支持
    Java 6 和 7,最低 JDK 8,支持 JDK 9。
  • 依赖组件升级

    本次 Spring Boot 2.0 的升级,同时也升级了部分其依赖的第三方组件,主要有以下几个:
    • Jetty 9.4,Jetty 是⼀个开源的 Servlet 容器器,它是基于 Java 的 Web 内容,例如 JSP 和 Servlet 提供运行环境。Jetty 是使用 Java 语言编写的,它的 API 以一组 JAR 包的形式发布。
    • Tomcat 8.5,Apache Tomcat 8.5.x 旨在取代 8.0.x,完全⽀持 Java 9。
    • Flyway 5,Flyway 是独⽴于数据库的应用、管理并跟踪数据库变更的数据库版本管理工具。用通俗的话讲,Flyway 可以像 SVN 管理不同人的代码那样,管理不同人的 SQL 脚本,从而做到数据库同步。
    • Hibernate 5.2,Hibernate 是⼀一款非常流行的 ORM 框架。
    • Gradle 3.4,Spring Boot 的 Gradle 插件在很⼤大程度上已被重写,有了了重⼤大的改进。
    • Thymeleaf 3.0,Thymeleaf 3 相对于 Thymeleaf 2 有非常大的性能提升。
  • 默认软件替换和优化

    默认连接池已从 Tomcat 切换到 HikariCP,HikariCP 是一个高性能的 JDBC 连接池。

    HikariCP 号称是 Java 业界最快的数据库连接池。

    HikariCP 性能为什什么如此突出?

    • 字节码精简:优化代码,直到编译后的字节码最少,这样CPU 缓存可以加载更多的程序代码。
    • 优化代理和拦截器:减少代码,例如 HikariCP 的 Statement proxy 只有 100 行代码。
    • 自定义数组类型(FastStatementList)代替 ArrayList:避免每次 get() 调用都要行 range check,避
      免调用 remove() 时从头到尾的扫描。
    • 自定义集合类型(ConcurrentBag):提高并发读写的效率。
    • 其他针对 BoneCP 缺陷的优化,比如对于耗时超过一个 CPU 时间片的方法调用的研究。
  • Spring Security

    Spring Security 是 Spring 社区的一个顶级项目,是 Spring Boot 官方推荐使用的 Security 框架。

    除了常规
    的 Authentication 和 Authorization 之外,Spring Security 还提供了了诸如 ACLs、LDAP、JAAS、CAS 等高级性以满足复杂场景下的安全需求。

    而 Spring Boot 中基于 Java 配置实现 Spring Security 功
    能。Spring Boot 2 极大地简化了默认的安全配置,并使添加定制安全变得简单。
    Spring Boot 2.0 ⾮常容易使用 Spring Security 5.0 保护响应式应用,当检测到 Spring Security 存在的时候会自动进行默认配置。

  • OAuth 2.0

    OAuth 2.0 是 OAuth 协议的延续版本,不向后兼容 OAuth 1.0。OAuth 2.0 关注客户端开发者的简易性。要么通过组织在资源拥有者和 HTTP 服务商之间的被批准的交互动作代表用户,要
    么允许第三方应用代表用户获得访问的权限。

    OAuth 2 是一个授权框架,它可以使第三方应⽤用程序或客户端获得对 HTTP 服务上(如
    Google、GitHub )用户帐户信息的有限访问权限。OAuth 2 通过将用户身份验证委派给托管用户帐户的服务以及授权客户端访问用户帐户进行工作。

    Spring Boot 2.0 将 Spring Security OAuth 项目迁移到 Spring Security。不再提供单独的依赖包,Spring
    Boot 2.0 通过 Spring Security 5 提供 OAuth 2.0 客户端支持。

  • Micrometer

    Micrometer 是一款监控指标的度量类库,可以让你在没有供应商锁定的情况下对 JVM 的应用程序代码进⾏调整。

    集成后提供 JVM 指标(包括 CPU、内存、线程和 GC)、Logback、Tomcat、Spring MVC 并且提供
    RestTemplate。

  • Redis

    Redis 默认引入了 Lettuce,替代了之前的 Jedis 作为底层的 Redis 连接方式。

    Lettuce 是一个可伸缩的线程安全的 Redis 客户端,用于同步、异步和反应使用。多个线程可以共享同⼀一个
    RedisConnection,它利用优秀 Netty NIO 框架来高效地管理多个连接,支持先进的 Redis 功能,如
    Sentinel、集群、流水线、自动重新连接和 Redis 数据模型。

  • 支持 HTTP/2

    HTTP/2 是第二代的 HTTP 协议,Spring Boot 的 Web 容器选择中 Tomcat,Undertow 和 Jetty 均已⽀支持
    HTTP/2。
  • JOOQ 的⽀支持

    JOOQ 是基于 Java 访问关系型数据库的工具包。JOOQ 既吸取了传统 ORM 操作数据的简单性和安全性,
    又保留了原生 SQL 的灵活性,它更像是介于 ORMS 和 JDBC 的中间层。

    对于喜欢写 SQL 的码农来说,
    JOOQ 可以完全满足,可以是用 Java 代码写出 SQL 的感觉来。

2、Spring Boot 2.0 入门程序

  • 新建 spring-boot-web 项目,在 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.5.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.rookie</groupId>
        <artifactId>springboot-web</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>springboot-web</name>
        <description>Demo project for Spring Boot web</description>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.4</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <configuration>
                        <fork>true</fork>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>
  • 创建实体对象 User

    @Getter
    @Setter
    @ToString
    public class User {
        private String name;
        private String address;
        private int age;
    }
    上面代码使用 lombok 插件,只需要注解即可省略 getter/setter/toString 等方法
  • 新建一个类 WebController,用于测试

    @RestController
    public class WebController {
    
        @RequestMapping(value = "/getUser", method = RequestMethod.POST)
        public User getUserInfo() {
            User user = new User();
            user.setName("我是菜鸟A");
            user.setAddress("北京");
            user.setAge(18);
    
            return user;
        }
    
        @RequestMapping(value = "/getUsers", method = RequestMethod.POST)
        public List<User> getUserListInfo() {
            List<User> users = new ArrayList<>();
    
            User user = new User();
            user.setName("我是菜鸟A");
            user.setAddress("北京");
            user.setAge(18);
            users.add(user);
    
            User user2 = new User();
            user2.setName("我是菜鸟B");
            user2.setAddress("南京");
            user2.setAge(28);
            users.add(user2);
    
            return users;
        }
    
        @RequestMapping(value = "/get/{name}", method = RequestMethod.GET)
        public String getName(@PathVariable String name) {
            return name;
        }
    }
    测试结果,使用 postman 进行模拟访问(使用 postman 的时候注意对应正确的请求的方式)

    localhost:8080/getUser

    { "name": "我是菜鸟A","address": "北京","age": 18}

    localhost:8080/getUsers

    [ {"name": "我是菜鸟A", "address": "北京", "age": 18},
    {"name": "我是菜鸟B", "address": "南京","age": 28} ]

    localhost:8080/get/rookie

    control 控制台会返回 :rookie


RookieMZL
47 声望5 粉丝