【JAVA企业级开发】教你如何快速的将前后端不分离以及难以处理的老旧SSM-War项目(Spring+Mybits+SpringMVC+JSP)改造成便于操作的SpringBoot-Jar项目

    技术2024-10-22  29

    这里写目录标题

    一级目录二级目录三级目录 一 旧项目1拥有配置文件众多2pom依赖版本比较杂乱 二 新项目1 更新SpringBoot的pom依赖2新增spring boot启动类,加载原先的xml配置文件1@SpringBootApplication2@MapperScan("baobaobaobao.dao")3@EnableTransactionManagement4@ImportResource5@componentscan 3SpringBoot的默认日志框架4 SpringBoot的配置文件application.properties5SpringBoot的配置类

    一级目录

    二级目录

    三级目录

    一 旧项目

    公司一个项目在开发中使用某些功能的时候,受限于spring低版本的限制,故索性将整个模块升级为spring boot,在这里做个记录,希望能帮助到有相同场景的朋友。

    整个改造过程非常简单,耗时大概在2个小时左右,主要解决项目中的各种版本冲突,我们SSM变化为使用SpringBoot统一版本。

    1拥有配置文件众多

    2pom依赖版本比较杂乱

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>ssm</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <!-- spring4.3.2 --> <!-- spring-context --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.2.RELEASE</version> </dependency> <!-- spring-core --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.3.2.RELEASE</version> </dependency> <!-- spring-beans --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.3.2.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>4.3.2.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>4.3.2.RELEASE</version> </dependency> <!--使用AspectJ方式注解需要相应的包 --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.6.11</version> </dependency> <!--使用AspectJ方式注解需要相应的包 --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.6.11</version> </dependency> <!-- mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> <!--数据源druid--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.3</version> </dependency> <!--mybitis--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <!--spring事务--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>4.3.2.RELEASE</version> </dependency> <!--springJDBC--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.3.2.RELEASE</version> </dependency> <!--mybitis-spring插件包--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.2</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>4.3.2.RELEASE</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> <!-- 配置jsp --> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.2.1</version> <scope>provided</scope> </dependency> <!-- spring web --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.3.2.RELEASE</version> </dependency> <!-- spring webmvc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.2.RELEASE</version> </dependency> <!--data--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.0</version> </dependency> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.0</version> </dependency> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.4.0</version> </dependency> </dependencies> <build> <!-- 配置tomcat插件,web端 --> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <!-- 配置项目的请求路径 --> <path>/mvc</path> <!-- 配置服务器端口号 --> <port>9091</port> </configuration> </plugin> <!-- mybatis-generator反向工程 --> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.4.0</version> <configuration> <!-- 在控制台打印执行日志 --> <verbose>true</verbose> <!-- 重复生成时会覆盖之前的文件--> <overwrite>true</overwrite> <configurationFile>src/main/resources/generatorConfig.xml</configurationFile> </configuration> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> </dependencies> </plugin> </plugins> </build> </project>

    二 新项目

    1 更新SpringBoot的pom依赖

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.0.RELEASE</version> </parent> <groupId>org.example</groupId> <artifactId>SpringBOOT</artifactId> <version>1.0-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <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>1.2.2</version> </dependency> <!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.3</version> </dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> <!--阿里数据源--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.3</version> </dependency> <!--jsp的支持的依赖--> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency> <!--jsp启动器--> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jsp-api</artifactId> </dependency> <!--servlet启动器--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> </dependency> <!--热部署--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <!--热部署scope的值必须为true--> <scope>true</scope> </dependency> <!--工具依赖邮箱--> <dependency> <groupId>com.bladejava</groupId> <artifactId>jmail</artifactId> <version>0.0.3</version> </dependency> </dependencies> <!--插件配置--> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>1.4.2.RELEASE</version> <configuration> <!-- 如果没有该配置,热部署的devtools不生效 --> <fork>true</fork> <mainClass>baobaobaobao.Application</mainClass> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> <!-- 自定义配置spring Boot使用的JDK版本 --> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> <resources> <!-- 打包时将jsp文件拷贝到META-INF目录下--> <resource> <!-- 指定resources插件处理哪个目录下的资源文件 --> <directory>src/main/webapp</directory> <!--注意此次必须要放在此目录下才能被访问到--> <targetPath>META-INF/resources</targetPath> <includes> <include>**/**</include> </includes> </resource> </resources> </build> </project>

    1 注意SpringBoot项目一般打Jar包,而不是War包,所以我们要去掉 <packaging>war</packaging> 2解决SpringBoot的jsp页面访问404的问题

    <!--jsp的支持的依赖--> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency> <!--jsp启动器--> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jsp-api</artifactId> </dependency> <!--servlet启动器--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> </dependency>

    3解决SpringBoot打Jar包时,在WEB-INF文件夹下的JSP页面没有被打包进去的问题

    <resources> <!-- 打包时将jsp文件拷贝到META-INF目录下--> <resource> <!-- 指定resources插件处理哪个目录下的资源文件 --> <directory>src/main/webapp</directory> <!--注意此次必须要放在此目录下才能被访问到--> <targetPath>META-INF/resources</targetPath> <includes> <include>**/**</include> </includes> </resource> </resources>

    2新增spring boot启动类,加载原先的xml配置文件

    package baobaobaobao; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.Banner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ImportResource; import org.springframework.transaction.annotation.EnableTransactionManagement; /** * Created by @author LiuChunhang on 2020/6/8. */ @SpringBootApplication @MapperScan("baobaobaobao.dao") @EnableTransactionManagement @ImportResource(locations = {"classpath:springmvc.xml","classpath:applicationContext.xml"}) public class Application { public static void main(String[] args) { SpringApplication springApplication = new SpringApplication(Application.class); springApplication.setBannerMode(Banner.Mode.OFF); springApplication.run(args); } }

    其中四个注解

    1@SpringBootApplication

    注解是Spring Boot的核心注解,它其实是一个组合注解 该注解主要组合了以下注解:

    @SpringBootConfiguration

    :这是Spring Boot项目的配置注解,这也是一个组合注解: 在Spring Boot项目中推荐使用@ SpringBootConfiguration替代@Configuration

    @EnableAutoConfiguration 启用自动配置,该注解会使Spring Boot根据项目中依赖的jar包自动配置项目的配置项: 如:我们添加了spring-boot-starter-web的依赖,项目中也就会引入SpringMVC的依赖,Spring Boot就会自动配置tomcat和SpringMVC 关闭自动配置 通过上述,我们得知,Spring Boot会根据项目中的jar包依赖,自动做出配置,Spring Boot支持的自动配置如下(非常多): 如果我们不需要Spring Boot自动配置,想关闭某一项的自动配置,该如何设置呢? 比如:我们不想自动配置Redis,想手动配置。

    @ComponentScan 默认扫描@SpringBootApplication所在类的同级目录以及它的子目录。

    2@MapperScan(“baobaobaobao.dao”)

    @MapperScan注解只会扫描包中的接口,不会扫描类

    @MapperScan("com.demo.mapper"):扫描指定包中的接口 @MapperScan("com.demo.*.mapper"):一个*代表任意字符串,但只代表一级包,比如可以扫到com.demo.aaa.mapper,不能扫到com.demo.aaa.bbb.mapper @MapperScan("com.demo.**.mapper"):两个*代表任意个包,比如可以扫到com.demo.aaa.mapper,也可以扫到com.demo.aaa.bbb.mapper

    我们用过@MapperScan注解之后就不用在ioc容器中注入 org.mybatis.spring.mapper.MapperScannerConfigurer来管理mapper接口了

    我们直接把ioc容器中的MapperScannerConfigurer依赖注解掉。

    3@EnableTransactionManagement

    Spring Boot 使用事务非常简单,首先使用注解 @EnableTransactionManagement 开启事务支持后,然后在访问数据库的Service方法上添加注解 @Transactional 便可。 关于事务管理器,不管是JPA还是JDBC等都实现自接口 PlatformTransactionManager 如果你添加的是 spring-boot-starter-jdbc 依赖,框架会默认注入 DataSourceTransactionManager 实例。如果你添加的是 spring-boot-starter-data-jpa 依赖,框架会默认注入 JpaTransactionManager 实例。

    对于事务管理器的配置,我们可以选择在 IOC容器中配置,也可以选择在 SpringBoot配置文件中配置,也可以选择在 JAVA配置类中配置。

    4@ImportResource

    @ImportResource(locations = {"classpath:springmvc.xml","classpath:applicationContext.xml"})

    5@componentscan

    @ComponentScan告诉Spring 哪个packages 的用注解标识的类 会被spring自动扫描并且装入bean容器。

    例如,如果你有个类用@Controller注解标识了,那么,如果不加上@ComponentScan,自动扫描该controller,那么该Controller就不会被spring扫描到,更不会装入spring容器中,因此你配置的这个Controller也没有意义。

    3SpringBoot的默认日志框架

    加载日志配置文件:

    logging.config=classpath:logback.xml(application.properties)

    创建日志对象:

    public static Logger log= LoggerFactory.getLogger(ProductServiceImpl.class);

    4 SpringBoot的配置文件application.properties

    #服务器端口 server.port=8080 #配置内置日志 logging.config=classpath:logback.xml #配置单文件上传最大值 spring.servlet.multipart.max-file-size=6MB #配置多文件请求上传最大值 spring.servlet.multipart.max-request-size=66MB #分页插件配置 #指定数据库 pagehelper.helper-dialect=mysql #分页合理化参数,默认值为false。当该参数设置为 true 时, #pageNum<=0 时会查询第一页 pagehelper.reasonable=true #支持通过 Mapper 接口参数来传递分页参数,默认值false pagehelper.support-methods-arguments=true

    在MyBatis的配置文件mybatisConfig.xml中的分页插件我们可以删除,把配置移除到Springboot的配置文件属性里 mybatisConfig.xml: 我们在IOC注入依赖SqlSessionFactoryBean的时候也就不用 配置 Mybatis的配置文件的property属性了,所以我们就可以把Mybatis的配置文件给删除掉了(因为在做Mybatis和Spring容器的整合的过程中,Mybatis的配置文件中只剩下一个 分页插件 的描述了)。

    5SpringBoot的配置类

    Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置。

    *注解Configuration 和 注解@Bean Spring的Java配置方式是通过 @Configuration 和 @Bean 这两个注解实现的: 1、@Configuration 作用于类上,相当于一个xml配置文件; 2、@Bean 作用于方法上,相当于xml配置中的<bean id=”” class=””></bean>;

    我们可以用Java配置配置 事务管理器和配置数据源,配置SqlSessionFactory,从而代替在IOC容器中的配置。

    例如写一个SpringBoot在上传下载文件时所需要的用到的配置,配置外部文件映射的类MyWebMvcConfigurer

    package baobaobaobao.config; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /** * Created by @author LiuChunhang on 2020/6/16. */ @Configuration public class MyWebMvcConfigurer implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { //就是说 url 中出现 resourceHandler 匹配时,则映射到 location 中去,location 相当于虚拟路径 //映射本地文件时,开头必须是 file:/// 开头,表示协议 //registry.addResourceHandler( "picture/**").addResourceLocations("/root/picture/"); System.out.println("静态请求通过虚拟路径到外部资源映射"); registry.addResourceHandler( "/view/**").addResourceLocations("file://"); } }
    Processed: 0.015, SQL: 9