在Spring Boot 2.0中提高了对Java版本的要求,我们需要至少使用Java 8才能使用它,如果您的Spring Boot应用还运行在Java 7上,那就要考虑升级jdk或者不要升级到Spring Boot 2.0版本
Spring Boot 1.X没有支持Java 9的计划,如果后期需要Java 9的新特性,那么还是要升级到Spring Boot 2.0,否则可以不考虑升级问题
Spring Boot 2.0在组建支持方面做了更新,然后支持的组建如下:
Tomcat升级至8.5
Flyway升级至5
Hibernate升级至5.2
Thymeleaf升级至3
Tomcat漏洞问题。经查Spring Boot 2.0选用的版本为8.5.28,属于安全版本,所以大家可以放心使用。
在Spring Boot 2.0中对于配置属性的重定位也是比较多的,这将导致一些原有的配置将不再生效,需要我们手工的去修改这些配置的Key来完成升级适配。比如,一些与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
#boot2.x配置
spring:
redis:
database: 0 # Database index used by the connection factory.
timeout: 0 # Connection timeout in milliseconds.
jedis:
pool:
max-active: 8 #
max-idle: 8 #
max-wait: -1 #
min-idle: 1 #
# boot1.x配置
spring:
datasource:
redis:
database: 0 # Database index used by the connection factory.
timeout: 0 # Connection timeout in milliseconds.
pool:
max-active: 8 #
max-idle: 8 #
max-wait: -1 #
min-idle: 1 #
这是springboot版本为1.3.2RELEASE中的RedisProperties配置文件类,从图片中可以看得出来该本的redis配置文件属性有两个内部静态类分别是Pool和Sentinel,七个属性变量。列入我们想在配置文件中设置redis数据库host地址,则可以这样写
# host为属性
spring.redis.host=localhost
#配置连接池的最大连接数
spring.redis.pool.max-active=8
这个是redis在application.properties中springboot低版本的配置
# REDIS (RedisProperties)# Redis数据库索引(默认为0)spring.redis.database=0# Redis服务器地址spring.redis.host=localhost# Redis服务器连接端口spring.redis.port=6379# Redis服务器连接密码(默认为空)spring.redis.password=# 连接池最大连接数(使用负值表示没有限制)spring.redis.pool.max-active=8# 连接池最大阻塞等待时间(使用负值表示没有限制)spring.redis.pool.max-wait=-1# 连接池中的最大空闲连接spring.redis.pool.max-idle=8# 连接池中的最小空闲连接spring.redis.pool.min-idle=0# 连接超时时间(毫秒)spring.redis.timeout=0
下图则是springboot版本为2.0.2RELEASE中的RedisProperties配置文件类,从图中可知pool属性则被封装到了内部静态类Jedis和Lettuce中去了,这时我们要是配置连接池的最大连接数,前缀还是spring.redis,有两种途径
spring.redis.**jedis**.pool.max-active=8 或者 spring.redis.**lettuce**.pool.max-active=8
这个是redis在application.properties中springboot高版本的配置
# REDIS (RedisProperties)# Redis数据库索引(默认为0)spring.redis.database=0# Redis服务器地址spring.redis.host=localhost# Redis服务器连接端口spring.redis.port=6379# Redis服务器连接密码(默认为空)spring.redis.password=# 连接池最大连接数(使用负值表示没有限制)spring.redis.jedis.pool.max-active=8# 连接池最大阻塞等待时间(使用负值表示没有限制)spring.redis.jedis.pool.max-wait=-1# 连接池中的最大空闲连接spring.redis.jedis.pool.max-idle=8# 连接池中的最小空闲连接spring.redis.jedis.pool.min-idle=0# 连接超时时间(毫秒)spring.redis.timeout=0
springboot版本1.4以下
org.springframework.boot spring-boot-starter-redis 1.3.2.RELEASE
org.springframework.boot spring-boot-starter-data-redis
在项目中,有个需求是前端传递Excel文件到后端,后端读取Excel文件中的数据,保存到数据库中,刚开始Exccel中存在少量的几十条数据,上传读取没有问题,后来需求方说文件中可能会有10W+条数据,当我再次测试的时候发现后端报错了:The field file exceeds its maximum permitted size of 1048576 bytes
后来才想起因为SpringBoot自带集成的Tomcat限制了文件上传大小,如果文件大于1M,则需要在application.yml配置文件中重新设置:
SpringBoot 2.0版本:
spring:
servlet:
multipart:
enabled: true
max-file-size: 10Mb
max-request-size: 100Mb
同时,1.x版本和2.x版本的配置方式也不一样,又是一个坑:
SpringBoot1.5.9版本
spring:
http:
multipart:
enabled: true
max-file-size: 10Mb
max-request-size: 100Mb
除了这种方式以外,还有另外一种方式可以处理:
编写一个Bean:
/**
* 文件上传配置
* @return
*/
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
//单个文件最大
factory.setMaxFileSize("10MB"); //KB,MB
//设置总上传数据总大小
factory.setMaxRequestSize("100MB");
return factory.createMultipartConfig();
}
这样就可以解决因为文件太大导致失败的问题。
从配置最明显的来看,RedisCacheManager类初始化不再以RedisTemplate为参数进行初始化,顺带引起了一些变化,遂记录于此。
引入依赖
org.springframework.boot
spring-boot-starter-data-redis
1.5.2.RELEASE
application.yml/properties配置
spring:
cache:
type: redis
redis:
host: 127.0.0.1
port: 6379
timeout: 0
database: 0
pool:
max-active: 8
max-wait: -1
max-idle: 8
min-idle: 0
到此springboot可以以通用方式配置redis缓存了。但是如果需要特殊处理,则需要自己利用代码进行配置了,比如 序列与反序列化方式, redis缓存key的生成方案等等。
按需配置
/**
Created by xiaoyiyiyo on 2018/4/28.
*/
@EnableCaching
@Configuration
public class RedisCacheConfig extends CachingConfigurerSupport{
@Bean
public RedisTemplate redisTemplate() {
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
//全局开关,支持jackson在反序列是使用多态
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
StringRedisTemplate redisTemplate = new StringRedisTemplate();
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
return redisTemplate;
}
@Bean
public CacheManager cacheManager(RedisTemplate redisTemplate) {
RedisCacheManager manager = new RedisCacheManager(redisTemplate);
manager.setUsePrefix(true);
RedisCachePrefix cachePrefix = new RedisPrefix(“prefix”);
manager.setCachePrefix(cachePrefix);
// 整体缓存过期时间
manager.setDefaultExpiration(3600L);
// 设置缓存过期时间。key和缓存过期时间,单位秒
Map
expiresMap.put(“user”, 1000L);
manager.setExpires(expiresMap);
return manager;
}
/**
引入依赖
同1.5.x
application.yml/properties配置
2.x版本默认redis客户端连接池类型有所不同。
版本 默认客户端类型
1.5.x jedis
2.x lettuce
所以配置连接池的时候会有不同,如下:
application.yml
spring:
cache:
type: redis
redis:
host: 127.0.0.1
port: 6379
timeout: 0
database: 0
jedis:
pool:
max-active: 8
max-wait: -1ms
max-idle: 8
min-idle: 0
package com.xiaoyiyiyo.configuration;
@Bean
public ObjectMapper objectMapper() {
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
om.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); //补上
return om;
}
@Bean
public GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer (ObjectMapper om) {
GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer(om);
return serializer;
}
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory,
GenericJackson2JsonRedisSerializer serializer) {
RedisTemplate redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(redisConnectionFactory);
RedisSerializer stringSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringSerializer);//key序列化
redisTemplate.setValueSerializer(serializer);//value序列化
redisTemplate.setHashKeySerializer(stringSerializer);//Hash key序列化
redisTemplate.setHashValueSerializer(serializer);//Hash value序列化
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
@Bean
public CacheManager cacheManager(RedisTemplate redisTemplate ) {
RedisCacheManager manager = new RedisCacheManager(redisTemplate);
manager.setUsePrefix(true);
// 整体缓存过期时间
manager.setDefaultExpiration(3600L);
// 设置缓存过期时间。key和缓存过期时间,单位秒
Map expiresMap = new HashMap<>();
expiresMap.put("user", 1000L);
manager.setExpires(expiresMap);
return manager;
}
// @Bean
// public RedisCacheConfiguration redisCacheConfiguration(GenericJackson2JsonRedisSerializer serializer) {
// return RedisCacheConfiguration
// .defaultCacheConfig()
// .serializeKeysWith(
// RedisSerializationContext
// .SerializationPair
// .fromSerializer(new StringRedisSerializer()))
// .serializeValuesWith(
// RedisSerializationContext
// .SerializationPair
// .fromSerializer(serializer));
// }
@Bean
@Override
public KeyGenerator keyGenerator() {
return (target, method, objects) -> {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append("::" + method.getName() + ":");
for (Object obj : objects) {
sb.append(obj.toString());
}
return sb.toString();
};
}