当前位置 博文首页 > 、唐城:SSM老项目修改为SpringBoot项目

    、唐城:SSM老项目修改为SpringBoot项目

    作者:[db:作者] 时间:2021-07-06 17:58

    SSM升级为SpringBoot

    前段时间把原来的JavaWeb项目架构升级为了Maven项目。技术栈则是从原生的Jdbc+Servlet升级到了SSM,现在准备把项目升级为SpringBoot。

    目前项目架构:

    image-20201029172218532

    升级步骤

    • 改POM
    • 改项目结构
    • 主启动类
    • 合并配置文件

    改POM

    POM文件导入的jar包非常的多,使用SpringBoot的场景启动器来简化。

    image-20201029172425062

    目前是一个单体项目,所有的功能都写在一个模块里面。所以我们可以使用<parent>标签来做jar包版本的仲裁。然后根据需要添加starter,这里我主要是SSM架构,所以添加如下几个即可。

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-parent</artifactId>
        <version>2.0.2.RELEASE</version>
    </parent>
    
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        </dependency>
    </dependencies>
    

    改项目结构

    目前的项目长这样,其中我们的页面要从webapp转移到resources里面,然后其他的基本上差别不大。

    image-20201029172759612

    如图,我们的SpringBoot项目应该是这个结构,其中resources里面默认自带两个文件夹,一个是templates,一个是static。templates是个特殊的目录,不能直接访问,一般存放着是一些模板引擎,比如JSP,themeleaf这类的。由于我目前的项目都是HTML页面发送Ajax请求来完成的,所以我们可以不必创建templates这个目录,创建一个static即可,然后把我们的webapp的文件都转移过去。

    image-20201029172914139

    改造完毕,其实SpringBoot这是在Maven的基础上添加了一些东西,并没有修改已有的。

    image-20201029173458388

    主启动类

    在我们的com.kaikeba.express目录右键创建主启动类,对于大家而言,只要保证这个类的路径和我们的各个文件夹同一层即可。

    image-20201029173612038

    创建主启动类

    @SpringBootApplication
    public class ExpressMainApplication {
        public static void main(String[] args) {
            SpringApplication.run(ExpressMainApplication.class, args);
        }
    }
    

    保证和我们创建的各个文件夹同一目录即可。

    image-20201029174021513

    合并配置文件

    目前我们主要有:数据库配置文件,log4j配置文件,spring配置文件,springmvc配置文件。

    image-20201029174132108

    首先我们先创建一个springboot的配置文件,我比较喜欢yml,这里以yml作为演示:

    如果变成一个树叶,说明我们的主启动类的配置是正确的。

    image-20201029174535334

    jdbc.properties

    这个好改

    jdbc.driverClassName=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql:///express?useUnicode=true&characterEncoding=utf-8&useSSL=false
    jdbc.username=root
    jdbc.password=123456
    

    yml

    spring:
      datasource:
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/express?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
        username: root
        password: 123456
    

    log4j

    其实有点复杂,这里我们主要为了打印SQL和BUG

    ### 设置###
    log4j.rootLogger = debug,stdout,D
    
    ### 输出信息到控制抬 ###
    log4j.appender.stdout = org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target = System.out
    log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
    
    ## 输出DEBUG 级别以上的日志到=E://logs/error.log ###
    log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
    log4j.appender.D.File = E://logs/log.log
    log4j.appender.D.Append = true
    log4j.appender.D.Threshold = DEBUG
    log4j.appender.D.layout = org.apache.log4j.PatternLayout
    log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
    
    ## 输出ERROR 级别以上的日志到=E://logs/error.log ###
    log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
    log4j.appender.E.File =E://logs/error.log
    log4j.appender.E.Append = true
    log4j.appender.E.Threshold = ERROR
    log4j.appender.E.layout = org.apache.log4j.PatternLayout
    log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
    
    

    yml

    这里我们可以如下组合,这里我先不配置日志文件了

    mybatis:
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
        
    logging:
      level:
        com.kaikeba.express.dao: debug  
    

    spring-config.xml

    大概分为如下部分。其中注解扫描就不用了,@SpringBootApplication这个注解自带注解扫描,加载配置文件来配置数据源也不用了,这里我们上面已经配好了。接下来是mybatis,这些对象的创建过程都交给自动配置类了我们等下进行对应的配置接口。事物的话,使用纯注解配置。

    image-20201029175513705

    为了简化目录结构,我把mapper.xml都放进resources的mapper目录下。

    image-20201029175930888

    配置mybatis的mapper扫描路径和别名管理器

    image-20201029175857246

    然而,我们的mybaits的starter并不是springboot写的,而是mybatis团队去适配springboot而写的。所以我们的@SpringBootApplication只会扫描自己的组件,不会扫描mybatis的组件,所以这里我们只是找到了xml的配置文件,并不知道我们的接口类在哪个目录。

    这里我们添加一个注解@MapperScan,和@ComponentScan一个意思,扫描指定的包。

    image-20201029180250209

    接口推荐使用@Mapper注解,其实@@Repository也行,不过Mapper是适配MapperScan注解,肯定会有更好的容错效果,不要太纠结用哪个。

    image-20201029180356234

    springmvc.xml

    其中注解扫描也是不用配置了,注解支持,静态资源过滤也不用了,static目录下的资源,Springboot都会视为静态资源处理。关于视图解析器,这里我们可以用springboot的配置文件进行配置,拦截器则是使用纯注解配置。

    image-20201029180546671

    配置视图解析器

    image-20201029180801632

    除了不能删的都删了。

    image-20201029180850017

    接下来,把之前的拦截器给加上,使用注解的方式来完成。

    主启动类添加两注解。

    image-20201029181514825

    已经有了一个拦截器了,这里使用如下方式进行配置。

    @Configuration
    public class SpringBootConfig extends WebMvcConfigurerAdapter {
        @Bean
        public LoginInterceptor securityInterceptor() {
            return new LoginInterceptor();
        }
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(securityInterceptor()).excludePathPatterns("/static/*")
                    .excludePathPatterns("/error").addPathPatterns("/**");
        }
    }
    

    我们的Springboot改造好了。

    image-20201029182245981

    启动没有报错
    image-20201029182323110

    cs