springboot1.x迁移到2.x填坑历程

之前项目一直使用的是1.4版本的,最近新开发一个项目,准备使用最新版本。去 spring 官网查询目前最新稳定(标有红色 GA)版本为2.1.3。OK!开始填坑之路

一:pom 文件中引入官方迁移插件


           org.springframework.boot
           spring-boot-properties-migrator
           runtime

该插件自动检测properties配置文件中的配置项,在 springboot启动的时候控制台会打印出旧的废弃的配置项,并给出新的配置项。

二:mysql 相关升级

springboot2.x默认使用HikariCP连接池,mysql 驱动对应升级。

配置文件修改
spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver
pom 文件更改

            mysql
            mysql-connector-java
            6.0.6
        

三:reids相关升级

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;
    }

四:springsecurity升级

升级到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"

五:设置web 环境

因为 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 下。
文件夹名称自己定义,不一定非要是 static
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)。
**

大功告成!

**

你可能感兴趣的:(springboot1.x迁移到2.x填坑历程)