项目SpringMvc转SpringBoot记录
- 背景介绍
项目基于JDK8,应用SpringMvc+Jsp的结构,前后端部分还未实现分离。
基于现有微服务架构,项目现有架构功能扩展复杂度高,风险不宜把控,项目需求迭代频繁,敏捷迭代困难,微服务组件和公共服务调用支持不便捷。需要在不影响业务的情况下,将SpringMvc架构先转为Springboot。
- 过程记录
- springboot pom 依赖整理
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 数据库连接 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- mybatisPlus组件包 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<!-- 数据库连接 -->
原有spring的部分pom引用重复冲突的清除
包冲突不一定对服务造成影响,可根据系统情况排除,最好是先清除明确不需要的依赖,其他冲突问题可在服务启动和调试时再处理。
2. application启动类添加
@SpringBootApplication
@Slf4j
@MapperScan({"com.ab.cd.dao""})
public class SpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootApplication .class, args);
log.info("+-+-+-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-+-+-+");
log.info("服务|启动成功! ");
log.info("+-+-+-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-+-+-+");
}
}
- application yml配置 @value
项目中存在很多@value的配置项,都需要实现yaml配置application.yml
server:
port: 8029
servlet:
context-path: /springboot
spring:
application:
name: springboot
## redis start ##
redis:
database: 0
host: localhost
port: 6378
password: ****
timeout: 3000ms
lettuce:
pool:
max-active: 8
max-wait: -1ms
max-idle: 8
min-idle: 0
## redis end ##
## datasource start ##
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:8066/hand_db?serverTimezone=GMT%2B8&allowMultiQueries=true # 数据库名称
username: ***
password: ****
druid:
#初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时
initial-size: 5
min-idle: 5 #最小连接池数量
max-active: 100 #最大连接池数量
max-wait: 60000 #获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
use-unfair-lock: true
validation-query: SELECT 1 #用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。
validation-query-timeout: 2 #单位:秒,检测连接是否有效的超时时间。底层调用jdbc Statement对象的void setQueryTimeout(int seconds)方法
test-while-idle: true #建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
test-on-borrow: false #申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
test-on-return: false #归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
reset-stat-enable: true
connection-init-sqls:
'set names utf8mb4;'
filters: stat
stat-view-servlet:
login-username: druid
login-password: druid
time-between-eviction-runs-millis: 300000 #空闲连接回收的时间间隔,与test-while-idle一起使用,设置5分钟
## datasource end ##
##邮件
mail:
host: smtp.qq.com
username: 1234@qq.com
password: 12345
properties:
mail:
smtp:
auth: true
starttls:
enable: true
required: true
resources:
# 配置静态资源地址,默认地址:"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/
static-locations: classpath:/webapp/,classpath:/static/
mvc:
view:
# 如果将html页面直接放在templates目录下,可能省略下面这行配置
#prefix: views
prefix: /
# 必须的,不然报错
suffix: .jsp
#配置了未生效
# static-path-pattern: /static/**
mybatis:
config-location: classpath:static/mybatis/mybatis.cfg.xml
type-aliases-package: com.**.**.dao.*
mapper-locations: classpath:/mapper/*/*.xml
logging:
#config: classpath:logback.xml
level:
# 这里配置切换根日志root级别 | DEBUG | INFO | WARN | ERROR
root: INFO
org.apache: WARN
com.**.**.dao: DEBUG
springfox.documentation: INFO
org.springframework: INFO
com.alibaba.nacos: WARN
- dao mapper扫描处理,xml移动到resource目录
Yaml mybatis 做配置项
mybatis:
config-location: classpath:static/mybatis/mybatis.cfg.xml
type-aliases-package: com.xm.**.dao.*
mapper-locations: classpath:/mapper/*/*.xml
Springboot需要添加dao层扫描,一般常见两种处理方式
接口类上加注解@Mapper
application 启动类上统一添加@MapperScan
注意项:application 启动类上统一添加@MapperScan时,需要指明dao路径,MapperScan扫描时会将接口interface注入bean,如果扫描范围过大,将service的接口也扫描到,启动会报错 多个bean实现问题。
--------------------------------------------------------------------
按正常流程,前面几项处理完后,简单springboot项目应该能正常启动访问了。
但一般项目中都会集成应用一些组件,原有模式项目启动会报错,那我们就得继续处理,改成支持springboot。
- freemarker版本升级匹配springboot
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.30</version>
</dependency>
原有freemarker版本不支持springboot,需要升级版本支持
- redis 改为springboot starter
Redis改为springboot集成
<!--SpringBoot整合redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
spring:
## redis start ##
redis:
database: 0
host: localhost
port: 6379
password: ****
timeout: 3000ms
lettuce:
pool:
max-active: 8
max-wait: -1ms
max-idle: 8
min-idle: 0
## redis end ##
參考地址 SpringBoot整合Redis_Xxxyfeng的博客-CSDN博客_springboot整合redis
- springboot整合javaMailSender
项目中应用了mail服务,需要改成springboot集成
<!--SpringBoot整合mail -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
<version>2.2.13.RELEASE</version>
</dependency>
Spring:
##邮件
mail:
host: smtp.qq.com
username: **@qq.com
password: ***
properties:
mail:
smtp:
auth: true
starttls:
enable: true
required: true
參考地址 SpringBoot整合javaMailSender_傲来雾-花果香的博客-CSDN博客_javamailsender依赖
- 启动后运行方法
项目存在启动后需要运行的方法,类似服务号菜单配置等,需要改成springboot集成
1 实现ApplicationRunner接口
2 实现CommandLineRunner接口
@Component
@Slf4j
public class MyRunner implements CommandLineRunner {
/**
* Callback used to run the bean.
*
* @param args incoming main method arguments
* @throws Exception on error
*/
@Override
public void run(String... args) throws Exception {
log.info("程序启动了");
}
}
參考地址 想springboot启动完成后执行某个方法 - 简书
-------------------------------------------------------------------
到此,服务可以正常启动成功,接口访问正常!接下来就是调试前端支持jsp了
- html jsp 页面访问支持配置 ,js css img 移动static
jsp页面在webapp下
js css img 静态资源在resource/static下
spring:
resources:
# 配置静态资源地址,默认地址:"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/
static-locations: classpath:/webapp/,classpath:/static/
mvc:
view:
# 如果将html页面直接放在templates目录下,可能省略下面这行配置
#prefix: views
prefix: /
# 必须的,不然报错
suffix: .jsp
#配置了未生效
# static-path-pattern: /static/**
先写个测试的html页面调试访问 suffix: .html
<!--SpringBoot JSP依赖-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
中间出现调试处理的问题:
页面请求不到
页面请求直接下载
Js\css\img静态资源404