读书笔记二之 springboot 2.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 中会直接报空指针异常,对结果集的检查会更加严格一些