前段时间把原来的JavaWeb项目架构升级为了Maven项目。技术栈则是从原生的Jdbc+Servlet升级到了SSM,现在准备把项目升级为SpringBoot。
目前项目架构:
升级步骤
POM文件导入的jar包非常的多,使用SpringBoot的场景启动器来简化。
目前是一个单体项目,所有的功能都写在一个模块里面。所以我们可以使用
标签来做jar包版本的仲裁。然后根据需要添加starter,这里我主要是SSM架构,所以添加如下几个即可。
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-parentartifactId>
<version>2.0.2.RELEASEversion>
parent>
<dependencies>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
dependency>
<dependency>
<groupId>org.aspectjgroupId>
<artifactId>aspectjweaverartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.mybatis.spring.bootgroupId>
<artifactId>mybatis-spring-boot-starterartifactId>
<version>2.1.3version>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
dependency>
dependency>
dependencies>
目前的项目长这样,其中我们的页面要从webapp转移到resources里面,然后其他的基本上差别不大。
如图,我们的SpringBoot项目应该是这个结构,其中resources里面默认自带两个文件夹,一个是templates,一个是static。templates是个特殊的目录,不能直接访问,一般存放着是一些模板引擎,比如JSP,themeleaf这类的。由于我目前的项目都是HTML页面发送Ajax请求来完成的,所以我们可以不必创建templates这个目录,创建一个static即可,然后把我们的webapp的文件都转移过去。
改造完毕,其实SpringBoot这是在Maven的基础上添加了一些东西,并没有修改已有的。
在我们的com.kaikeba.express目录右键创建主启动类,对于大家而言,只要保证这个类的路径和我们的各个文件夹同一层即可。
创建主启动类
@SpringBootApplication
public class ExpressMainApplication {
public static void main(String[] args) {
SpringApplication.run(ExpressMainApplication.class, args);
}
}
保证和我们创建的各个文件夹同一目录即可。
目前我们主要有:数据库配置文件,log4j配置文件,spring配置文件,springmvc配置文件。
首先我们先创建一个springboot的配置文件,我比较喜欢yml,这里以yml作为演示:
如果变成一个树叶,说明我们的主启动类的配置是正确的。
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,这些对象的创建过程都交给自动配置类了我们等下进行对应的配置接口。事物的话,使用纯注解配置。
为了简化目录结构,我把mapper.xml都放进resources的mapper目录下。
配置mybatis的mapper扫描路径和别名管理器
然而,我们的mybaits的starter并不是springboot写的,而是mybatis团队去适配springboot而写的。所以我们的@SpringBootApplication只会扫描自己的组件,不会扫描mybatis的组件,所以这里我们只是找到了xml的配置文件,并不知道我们的接口类在哪个目录。
这里我们添加一个注解@MapperScan,和@ComponentScan一个意思,扫描指定的包。
接口推荐使用@Mapper注解,其实@@Repository也行,不过Mapper是适配MapperScan注解,肯定会有更好的容错效果,不要太纠结用哪个。
springmvc.xml
其中注解扫描也是不用配置了,注解支持,静态资源过滤也不用了,static目录下的资源,Springboot都会视为静态资源处理。关于视图解析器,这里我们可以用springboot的配置文件进行配置,拦截器则是使用纯注解配置。
配置视图解析器
除了不能删的都删了。
接下来,把之前的拦截器给加上,使用注解的方式来完成。
主启动类添加两注解。
已经有了一个拦截器了,这里使用如下方式进行配置。
@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改造好了。
springboot和spring本来就是一家人,spring系列框架都是低侵入性的,所以我们写好的代码不要动,基本上就是改改文件即可。