SpringBoot重构SpringMVC项目
最近接手了一个遗留项目,使用SpringMVC框架作为基础架构。在习惯了SpringBoot那种简易清新的风格,再难适应spring的一系列配置文件,于是着手将项目迁移到SpringBoot框架上。遇到一些列的问题,经过不懈努力,总算是勉强达到自己标准。
springboot所需要的包,以及包冲突
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring.boot.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>${spring.boot.version}</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.spring.boot.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>1.0.0</version>
</dependency>
其中包含mybatis,druid连接池,redis,dubbo的包。基本上能够满足目前主流的开发需要。其他的可在此基础上添加,并删除工程以前的springMVC的包。
在构建是遇到Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the class path, preempting StackOverflowError
这样的包冲突。
参数原因: 这两个包都是slf4j日志标准api的实现,让程序不知道选择哪一个去实现。(爱的人太多也是一种负担)
解决方法: 排除掉所有包换slf4j-log4j12.jar的包,以前遇到这种问题直接就蒙圈了。自从有了IDEA,这类问题变得so easy。在maven工具箱中,选择 show dependency 工具,如下所示,选择要分析模块,点击图标。
就会出现该模块的整个包依赖关系。
找到对应的包,右击,exclude,轻松解决。
SpringMVC模式重构
在以前的MVC模式中,浏览器发送请求到后台,后台完成数据处理,将数封装到model然后定向到页面,完成静态页面封装后,返回到前端。
这种方式的弊端较多,如下:
- web容器亚历山大
- 响应慢
- 无法做到前后端分离
目前的发展趋势是让前端和后端分离,前端开发前端的页面,有数据需要的再通过接口向后台抓。后台就只需要处理数据就OK,不用管前端的页面逻辑。双方按照API进行开发就行。
springboot配置静态资源页面,对该目录下的所有请求放行。
遇到问题: 以前的工程,html页面是放在WEB-INF目录下的,不管我怎样配置,都不能达到效果,参照了以前的项目,创建了一个views,将html文件都放在该目录下。css和js等静态资源文件放在statics目录下。
静态资源配置:
@Component
public class WebMvcConfig implements WebMvcConfigurer {
/**
* 添加静态资源文件,外部可以直接访问地址
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//其他静态资源,与本文关系不大
registry.addResourceHandler("/upload/**").addResourceLocations("file:/upload/");
//需要配置1:----------- 需要告知系统,这是要被当成静态文件的!
//第一个方法设置访问路径前缀,第二个方法设置资源路径
registry.addResourceHandler("/statics/**").addResourceLocations("classpath:/statics/");
registry.addResourceHandler("/js/**").addResourceLocations("classpath:/js/");
registry.addResourceHandler("/views/**", "/login.html", "/index.html").
addResourceLocations("classpath:/views/");
}
继承WebMvcConfigurer接口,重写addResourceHandlers方法,添加静态资源请求的请求及路径。
前端改造
使用jqueryUI + vue.js来实现前端逻辑,放弃了模板引擎。虽然现在的模板引擎实现起来也比较简单,但是调试起来还是很头大,比如说某一个参数的逻辑判断写错了,页面就是显示不出来,上手的时候经常遇到这类问题。使用vue.js后,显得模板引擎已经不是必须品了。
jqueryUI的jqGrid,用起来真的很nice,对于我这种前端小白来说,真是爽得飞起。有兴趣的可深入学习下。
如此,再对工程稍加改造,将前端迁移出来,就可以将前后端分开部署了,再结合node.js或是更简单点,直接开个nginx,就可以释放后端很大一部分压力。对负载高的,可以尝试下,负载低的就没必要了,给运维减轻些工作量。
兼容springMVC配置
由于很多业务代码,是基于spring的bean配置方式,改动起来的代价就比较大了。可以使用import的方式,将以前的bean配置文件引入进来。
@SpringBootApplication
@ImportResource(locations = {"classpath:applicationContext.xml"})
@EnableWebMvc
public class Application extends SpringBootServletInitializer {
private static final Logger logger = LoggerFactory.getLogger(Application.class);
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
logger.info("system init");
return application.sources(Application.class);
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
启动类加载applicationContext.xml文件,在applicationContext.xml中加载application.yml配置文件和bean文件。如下所示:
<context:property-placeholder location="classpath:application.yml" ignore-unresolvable="true"/>
<import resource="classpath:spring/application-webstore-service.xml"/>
<import resource="classpath:spring/application-webStore-redis.xml"/>
<import resource="classpath:spring/application-sys-shiro.xml"/>
<import resource="classpath:spring/application-sys-fastdfs.xml"/>
如此,完成springMVC工程的改造。