在Spring Boot 1.0项目中 src/main/resources 路径下新建一个banner.txt文件,文件中写入一些字符,启动项目时就会发现默认的 Banner被替换了,到了Spring Boot2.0现在可以支持Gif文件的打印,Spring Boot2.0在项目启动的时候,会将Gif图片的每一个画面,按照顺序打印在日志中,所有的画面打印完毕后,才会启动Spring Boot项目。
项目的启动Banner 有什么用呢,在一些大的组织或者公司中,可以利用这个特性定制自己专属的启动画面,增加团队对品牌的认同感。
从Spring Boot 1.0升级到2.0之后,有很多的API已经过时,在使用的时候需要注意。
Spring Boot 部署到Tomcat中去启动时需要在启动类添加SpringBootServletlnitializer,2.0和1.0有区别。
// 1.0
import org.springframework.boot.web.support.SpringBootServletInitializer;
// 2.0
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@SpringBootApplication
public class UserManageApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder applicat
ion) {
return application.sources(UserManageApplication.class);
}
public static void main(String[] args) throws Exception {
SpringApplication.run(UserManageApplication.class, args);
}
}
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());
Spring Boot 2.0 中spring-boot-starter-thymeleaf 包默认并不包含布局模块,使用Thymeleaf 对页面进行布局时,需要单独添加布局模块,如下:
nz.net.ultraq.thymeleaf
thymeleaf-layout-dialect
layout:decorator 标签在 3.0 过期,推荐使用新的标签 layout:decorate 进行页面布局。
大量的Servlet 专属的server.*被移到了server.servlet.*下:
原spring.htp.*或spring.server.*下的一些参数,例如我用到了文件上传参数,已修改为sping.servlet.multipart下。
Spring Boot2.0中将原来的WebMvcConfigurerAdapter 替换为WebMvcConfigurer。
public class MyWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter
public class MyWebMvcConfigurerAdapter implements WebMvcConfigurer
以前的findOne()方法其实就是根据传入的ID来查找对象,所以在Spring Boot2.0的Repository中我们可以添加findByld(long id)来替换使用。
例如:
User user=userRepository.findOne(Long id)
改为手动在userRepository手动添加findByld(long id)方法,使用时将findOne()调用改为fimdByld(long id)。
User user=userRepository.findById(long id)
delete()方法和findOne()类似也被去掉了,可以使用deleteByld(Long id)来替换,还有一个不同点是deleteByld(Long id)默认实现返回值为void。
Long deleteById(Long id);
改为:
//delete 改为 void 类型
void deleteById(Long id);
当然我们还有一种方案可以解决上述的两种变化,就是自定义SQL(如下),但是没有上述方案简单,不建议使用。
@Query("select t from Tag t where t.tagId = :tagId")
Tag getByTagId(@Param("tagId") long tagId);
Spring Boot2.0需要指定主键的自增策略,这个和Spring Boot1.0有所区别,1.0会使用默认的策略,如果不指定自增策略会报错。
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private long id;
在Spring Boot2.0中,方法new PageRequest(page,size,sort)已经过期不再推荐使用,推荐使用以下方式来构建分页信息:
Pageable pageable =PageRequest.of(page, size, Sort.by(Sort.Direction.ASC,"id"));
跟踪了一下源码发现PageRequest.of()方法,内部还是使用的new PageRequest(page,size,sort),只是最新的写法更简洁一些。
public static PageRequest of(int page, int size, Sort sort) {
return new PageRequest(page, size, sort);
}
在使用Spring Boot1.0时,使用JPA关联查询时我们会构建一个接口对象来接收结果集,类似如下:
public interface CollectView{
Long getId();
Long getUserId();
String getProfilePicture();
String getTitle();
}
在使用Spring Boot 1.0时,如果没有查询到对应的字段会返回空,在Spring Boot2.0中会直接报空指针异常,对结果集的检查会更加严格一些。
这只是目前升级过程中发现的⼀一些问题,不代表 Spring Boot 2.0 升级中的所有问题,在随后的课程中会再——⼀一介绍。
通过以上内容可以看出Spring Boot2.0相对于1.0增加了很多新特性,并且最重要的是Spring Boot2.0依赖的JDK最低版本是1.8,估计国内大多互联网公司还没有这么激进。另外一个新的重大版本更新之后,难免会有一些小Bug什么的,往往需要再发布几个小版本之后,才会慢慢稳定下来。
因此我的建议是,如果不是特别需要使用Spring Boot2.0上面提到的新特性,就尽量不要着急进行升级,等Spring Boot2.0彻底稳定下来后再使用。如果想要升级也请先从早期的版本升级到Spring Boot 1.5X系列之后,再升级到Spring Boot2.0版本,Spring Boot2.0的很多配置内容和Spring Boot1.0不一致需要注意。
Spring Boot 1.0发布之后给我们带来了全新的开发模式,Spring Boot 2.0发布标志着Spring Boot已经走向成熟,对Java领域带来的变革已经开启!
可以看出Spring Boot2.0是历时4年开发出来的巨作,在Spring Boot1.0的基础上进行了大量的优化,淘汰了很多过期的API,同时引入了一大批最新的技术,这些新技术在未来的一段时间内都具有引导性。在我们学习Spring Boot2.0的同时,需要同时学习Spring Boot2.0引入的一些新技术,不建议大家在生产环境直接进行升级,等Spring Boot 2.0进一步稳定之后再升级替换。