之前项目一直使用的是1.4版本的,最近新开发一个项目,准备使用最新版本。去 spring 官网查询目前最新稳定(标有红色 GA)版本为2.1.3。OK!开始填坑之路
org.springframework.boot
spring-boot-properties-migrator
runtime
该插件自动检测properties配置文件中的配置项,在 springboot启动的时候控制台会打印出旧的废弃的配置项,并给出新的配置项。
springboot2.x默认使用HikariCP连接池,mysql 驱动对应升级。
配置文件修改
spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver
pom 文件更改
mysql
mysql-connector-java
6.0.6
redis默认客户端连接由 jedis 更换为lettuce。 楼主使用的是 redis 哨兵模式,配置文件中自定义了一些配置项,在 java 代码中初始化。
1.配置文件自定义
lettuce.redis.sentinel.nodes=127.0.0.1:26379,127.0.0.2:26379,127.0.0.3:26379
lettuce.redis.sentinel.master=****
lettuce.redis.password=****
lettuce.redis.database=1
lettuce.redis.minIdle=2
lettuce.redis.maxIdle=8
lettuce.redis.maxTotal=8
2.java 代码初始化
private final static int MAX_WAIT = 2000;
@Value("${lettuce.redis.sentinel.nodes}")
private String nodes;
@Value("${lettuce.redis.sentinel.master}")
private String master;
@Value("${lettuce.redis.password}")
private String password;
@Value("${lettuce.redis.database}")
private int database;
@Value("${lettuce.redis.minIdle}")
private int minIdle;
@Value("${lettuce.redis.maxIdle}")
private int maxIdle;
@Value("${lettuce.redis.maxTotal}")
private int maxTotal;
/**
* 初始化执行顺序 1
* 配置哨兵以及密码等
*
* @return
*/
@Bean
public RedisSentinelConfiguration redisSentinelConfiguration() {
logger.info("[redis init start] nodes:{},master:{},database:{}", nodes, master, database);
Set sentinels = new HashSet();
String nodeArr[] = nodes.split(",");
for (String node : nodeArr) {
String[] ipPort = node.split(":");
RedisNode redisNode = new RedisNode(ipPort[0], Integer.valueOf(ipPort[1]));
sentinels.add(redisNode);
}
RedisSentinelConfiguration redisSentinelConfiguration = new RedisSentinelConfiguration();
redisSentinelConfiguration.setMaster(master);
redisSentinelConfiguration.setPassword(RedisPassword.of(password));
redisSentinelConfiguration.setDatabase(database);
redisSentinelConfiguration.setSentinels(sentinels);
return redisSentinelConfiguration;
}
/**
* 初始化执行顺序 2
* 连接池相关配置
*
* @return
*/
@Bean
public GenericObjectPoolConfig genericObjectPoolConfig() {
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
poolConfig.setMaxIdle(maxIdle);
poolConfig.setMinIdle(minIdle);
poolConfig.setMaxTotal(maxTotal);
poolConfig.setMaxWaitMillis(MAX_WAIT);
return poolConfig;
}
/**
* 初始化执行顺序 3
* Lettuce 线程池相关配置
*
* @param genericObjectPoolConfig
* @return
*/
@Bean
public LettuceClientConfiguration lettuceClientConfiguration(GenericObjectPoolConfig genericObjectPoolConfig) {
return LettucePoolingClientConfiguration.builder()
.poolConfig(genericObjectPoolConfig)
.build();
}
/**
* 初始化执行顺序 4
*
* @param redisSentinelConfiguration
* @param lettuceClientConfiguration
* @return
*/
@Bean
public LettuceConnectionFactory lettuceConnectionFactory(RedisSentinelConfiguration redisSentinelConfiguration, LettuceClientConfiguration lettuceClientConfiguration) {
return new LettuceConnectionFactory(redisSentinelConfiguration, lettuceClientConfiguration);
}
/**
* 初始化执行顺序 5
*
* @param redisConnectionFactory
* @return
*/
@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
logger.info("[redis init end]......");
StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
stringRedisTemplate.setConnectionFactory(redisConnectionFactory);
return stringRedisTemplate;
}
升级到2.x 以上,使用springsecurity的童鞋会发现 sec 标签无效或者不起作用,这是因为 spring 已经升级到5了,springsecurity4当然也得升级到5喽。
pom文件引入:
org.thymeleaf.extras
thymeleaf-extras-springsecurity5
3.0.4.RELEASE
html文件 sec标签引入:
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5"
因为 springboot2引入了webflux,和之前依赖 servlet的 mvc 是完全不同的一套独立的处理模式。启动设置 web 环境如下:
public static void main(String[] args) {
SpringApplication app = new SpringApplication(Application.class);
app.setWebApplicationType(WebApplicationType.SERVLET);//此处设置 servlet 环境
app.run(args);
}
切记,springboot2的静态资源必须手动设置路径映射才可以访问。
1.在 resources下面手动新建文件夹,楼主新建的文件夹名称为 static,当然也可以叫其他名字,比如 demo。然后把所有的静态资源文件放到 static 或者 demo 下。
2.java 代码配置,切记,在Spring Boot 1.5版本都是靠重写WebMvcConfigurerAdapter的方法来添加自定义拦截器,消息转换器等。SpringBoot 2.0 后,该类被标记为@Deprecated。因此我们只能靠实现WebMvcConfigurer接口来实现。
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
private MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor) // 此处需要添加一个自定义的拦截器
.addPathPatterns("/**")
// 如果第1步创建的文件夹名称为 demo,此处应为
// .excludePathPatterns("/demo/**")
.excludePathPatterns("/static/**")
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 如果第1步创建的文件夹名称为 demo,此处应为
// registry.addResourceHandler("/demo/**").addResourceLocations("classpath:/demo/");
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
}
最简单的自定义拦截器实现:
@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
3.html 页面引入。此处必须全路径引入
//如果第1步创建的文件夹名称为 demo,此处应为
//
温馨提示:如果配置完毕后资源文件还访问不到,执行命令:mvn clean,或者手动删除项目文件目录下的target的编译文件(classes)。
**
**