读书笔记二之 springboot 2.0 新特性

2019-11-25  本文已影响0人  木易木木重新谈技术

Spring Boot 2.0 支持了动态 Gif 的启动 Logo 打印。

在 Spring Boot 1.0 项目中 src/main/resources 路径下新建一个 banner.txt 文件,文件中写入一些字符,启动项目时就会发现默认的 Banner 被替换了,到了 Spring Boot 2.0 现在可以支持 Gif 文件的打印,Spring Boot 2.0 在项目启动的时候,会将 Gif 图片的每一个画面,按照顺序打印在日志中,所有的画面打印完毕后,才会启动 Spring Boot 项目。

项目的启动 Banner 有什么用呢,在一些大的组织或者公司中,可以利用这个特性定制自己专属的启动画面,增加团队对品牌的认同感。

1.0 升级 2.0 API 变化

启动类 SpringBootServletInitializer

Spring Boot 部署到 Tomcat 中去启动时需要在启动类添加 SpringBootServletInitializer,2.0 和 1.0 有区别。

// 1.0import org.springframework.boot.web.support.SpringBootServletInitializer;

// 2.0import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplicationpublic class UserManageApplication extends SpringBootServletInitializer {

@Override

protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {

    return application.sources(UserManageApplication.class); }

public static void main(String[] args) throws Exception {     

    SpringApplication.run(UserManageApplication.class, args);

}}                                                                                                                                                                                           

Spring Boot 2.0 默认不包含 log4j,建议使用 slf4j。

import org.apache.log4j.Logger;protected Logger logger = Logger.getLogger(this.getClass());

改为:

import org.slf4j.Logger;import org.slf4j.LoggerFactory;protected Logger logger = LoggerFactory.getLogger(this.getClass());

Thymeleaf 3.0 默认不包含布局模块

Spring Boot 2.0 中 spring-boot-starter-thymeleaf 包默认并不包含布局模块,使用 Thymeleaf 对页面进行布局时,需要单独添加布局模块,如下:

<dependency>

  <groupId>nz.net.ultraq.thymeleaf</groupId>

  <artifactId>thymeleaf-layout-dialect</artifactId>

</dependency>

layout:decorator 标签在 3.0 过期,推荐使用新的标签 layout:decorate 进行页面布局。

配置文件

大量的 Servlet 专属的 server.* 被移到了 server.servlet.* 下:

Old property                       New property

server.context-parameters.*     server.servlet.context-parameters.*

server.context-path               server.servlet.context-path

server.jsp.class-name           server.servlet.jsp.class-name

server.jsp.init-parameters.*    server.servlet.jsp.init-parameters.*

server.jsp.registered        server.servlet.jsp.registered

server.servlet-path        server.servlet.path

原 spring.http.* 或 spring.server.* 下的一些参数,例如我用到了文件上传参数,已修改为 sping.servlet.multipart 下。

WebMvcConfigurerAdapter 过期

Spring Boot 2.0 中将原来的 WebMvcConfigurerAdapter 替换为 WebMvcConfigurer。

1.0 中的用法:

public classMyWebMvcConfigurerAdapterextendsWebMvcConfigurerAdapter

2.0 中的用法:

public classMyWebMvcConfigurerAdapterimplementsWebMvcConfigurer

Spring Boot JPA 变化

去掉了 xxxOne() 方法

以前的 findOne() 方法其实就是根据传入的 ID 来查找对象,所以在 Spring Boot 2.0 的 Repository 中我们可以添加 findById(long id) 来替换使用。

例如:

User user=userRepository.findOne(Long id)

改为手动在 userRepository 手动添加 findById(long id) 方法,使用时将 findOne() 调用改为 findById(long id):

User user=userRepository.findById(long id)

delete() 方法和 findOne() 类似也被去掉了,可以使用 deleteById(Long id) 来替换,还有一个不同点是 deleteById(Long id) 默认实现返回值为 void。

LongdeleteById(Long id);

改为:

//delete 改为 void 类型void deleteById(Long id);

当然我们还有一种方案可以解决上述的两种变化,就是自定义 SQL(如下),但是没有上述方案简单,不建议使用。

@Query("select t from Tag t where t.tagId = :tagId")    

Tag    getByTagId(@Param("tagId")longtagId);

需要指定主键的自增策略

Spring Boot 2.0 需要指定主键的自增策略,这个和 Spring Boot 1.0 有所区别,1.0 会使用默认的策略,如果不指定自增策略会报错。

@Id@GeneratedValue(strategy= GenerationType.IDENTITY)private long id;

分页组件 PageRequest 变化

在 Spring Boot 2.0 中 ,方法 new PageRequest(page, size, sort) 已经过期不再推荐使用,推荐使用以下方式来构建分页信息:

Pageable pageable =PageRequest.of(page, size, Sort.by(Sort.Direction.ASC,"id"));

JPA 关联查询

在使用 Spring Boot 1.0 时,使用 JPA 关联查询时我们会构建一个接口对象来接收结果集,类似如下:

public interfaceCollectView{

  LonggetId();

  LonggetUserId();

  StringgetProfilePicture();

  StringgetTitle();

}

在使用 Spring Boot 1.0 时,如果没有查询到对应的字段会返回空,在 Spring Boot 2.0 中会直接报空指针异常,对结果集的检查会更加严格一些

上一篇下一篇

猜你喜欢

热点阅读