(一) 基础配置
1、配置数据库连接池
① 添加依赖:MySQL驱动
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
② 自动配置方式
四要素在 application.properties 中填写
spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql:///rbac?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8 spring.datasource.username=root spring.datasource.password=admin
默认连接池:Hikari,修改成 Druid
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.21</version>
</dependency>
2、集成MyBatis
① 添加依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
② 配置Mapper对象
扫描 Mapper 接口只要在配置类(启动类)上贴个注解 @MapperScan 并指定扫描的包路径即可;
@SpringBootApplication
@MapperScan("cn.qyw.mapper")
public class SsmApplication {
public static void main(String[] args) {
SpringApplication.run(SsmApplication.class, args);
}
}
③ 配置属性
在 application.properties 配置以前在 XML 配置了的那些 MyBatis 的属性,属性前缀 mybatis。
# 配置别名
mybatis.type-aliases-package=cn.wolfcode.domain
# 打印 SQL 日志
logging.level.cn.wolfcode.mapper=trace
3、事务管理
① 配置依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
② XML方式(了解)
采取配置类和 XML 混用的策略,在配置类上使用 @ImportResource("classpath:spring-tx.xml")。
③ 注解方式
直接在业务层实现类上或者其方法上直接贴 @Transactional 注解即可。Spring Boot 自动配置中提供了 TransactionAutoConfiguration 事务注解自动配置类,引入了事务的依赖后,可直接使用 @Transactional 注解。
④ 配置代理实现
Spring Boot 默认优先选择 CGLIB 代理,如果需要改为优先使用 JDK 代理,需要做以下配置:
spring.aop.proxy-target-class=false
⑤ 测试验证
在测试类上添加方法,打印业务对象看下其真实类型。
@Test
public void testSave() {
System.out.println(departmentService.getClass());
}
4、集成Web
① 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
② 修改端口
在application.properties中配置
server.port=80
③ 静态资源处理*
static:存放静态资源 ,相当于webapp的根目录,【css、js...】
templates:存放模板文件;
默认情况下,SpringBoot会从 classpath 下的 /static,/public,/resource,/META-INF/resource下加载静态资源;
可以在 application.properties 中配置 spring.resources.staticLocations 属性来修改静态资源加载地址。
spring.resources.static-locations=静态资源加载地址
因为应用是打成 jar 包,所以之前的 src/main/webapp 就作废了,如果有文件上传,那么就的必 须去配置图片所在的路径
# 告诉 Spring Boot 什么访问的路径是找静态资源
spring.mvc.static-path-pattern=/static/**
④ 前端控制器映射路径配置
在 Spring Boot 自动配置中,WebMvcAutoConfiguration 自动配置类导入了DispatcherServletAutoConfiguration 配置对象,会自动创建 DispatcherServlet 前端控制器,默认的映射路径是 /,Spring Boot 多数用于前后端分离和微服务开发,默认支持 RESTFul 风格,所以一般都是使用默认的即可,不做改动。
# Thymelea 模板配置 默认不配置
spring.mvc.pathmatch.use-registered-suffix-pattern=true
5、集成 Thymeleaf
① 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
② 相关配置
# Thymelea 模板配置
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=HTML
spring.thymeleaf.encoding=UTF-8
# 热部署文件,页面不产生缓存,及时更新
spring.thymeleaf.cache=false
③ 修改模板文件
使用Thymeleaf 的语法替换之前 JSP 中的 EL 表达式和 JSTL;
(二) 优化配置
6、统一异常处理
(1) 框架自带
我们需要在resources/static 或 template 文件下创建一个error的文件夹的文件夹 ,放入自己准备好的错误页面;
Spring Boot 默认情况下,会把所有错误都交给 BasicErrorController 类完成处理,错误的视图导向到 classpath:/static/error/ 和 classpath:/templates/error/ 路径上,HTTP 状态码就是默认视图的名称。如: 出现 404 错误 -> classpath:/static/error/404.html 出现 5xx 错误 -> classpath:/static/error/5xx.html
(2) 控制器增强
除了404,还有5XX,用框架的无法个性化的处理,我们可以定义一个控制器增强器,专门用于统一异常处理,针对5xx类错误,做到针对错误异常进行差异化处理; 在 web/advice中创建一个增强类处理异常;
@ControllerAdvice
public class ExceptionControllerAdvice {
// 处理服务器异常的方法(类似处理方法,String ModelView 自定义类型)
@ExceptionHandler(RuntimeException.class) // 表示什么异常交给下面这个方法处理
// HandlerMethod Spring MVC 对处理方法封装的类,访问哪个处理方法处理异常,handlerMethod 就是谁
public String handException(RuntimeException e, Model model, HandlerMethod handlerMethod) {
e.printStackTrace(); // 在控制台打印错误信息
System.out.println("handlerMethod = " + handlerMethod);
model.addAttribute("msg",e.getMessage());
return "404"; // 指定错误页面视图名称
}
@ExceptionHandler(ArithmeticException.class) // 表示什么异常交给下面这个方法处理
@ResponseBody
public JsonResult handleException01(ArithmeticException e){
JsonResult jsonResult = new JsonResult(); // 错误信息以 JSON 格式返回
jsonResult.setSuccess(false);
jsonResult.setMsg(e.getMessage());
return jsonResult;
}
}
7、添加拦截器 *
① 编写拦截器
让 Spring 管理拦截器 bean 对象,在拦截器类上贴 @Component 注解,一般放在 web/interceptor文件内;可重写三个方法:
preHandle:预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器; 返回值:true表示继续流程(如调用下一个拦截器或处理器); false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我 们需要通过response来产生响应;
postHandle:后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过 modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView 也可能为null。
afterCompletion:整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录 结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中finally, 但仅调用处理器执行链中preHandle返回true的拦截器的afterCompletion。
@Component
public class HelloInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("留个脚印");
return true;
}
② 配置定义拦截器
定义一个配置类,实现 WebMvcConfigurer 接口,在 addInterceptors 方法注册拦截器。
@Configuration
public class MvcConfig implements WebMvcConfigurer {
@Autowired
private HelloInterceptor helloInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册登录拦截器
registry.addInterceptor(helloInterceptor)
// 对哪些资源起过滤作用
.addPathPatterns("/**")
// 对哪些资源起排除作用
.excludePathPatterns("/static/**");
}
}
8、系统日志
日志数据不仅可以在控制台显示,还可以存入文件、数据库中,为了方便在日后维护中找到问题; 日志级别由低到高 trace < debug < info < warn < error 。如果设置的级别为 info,则 debug 以及 trace 级别的都无法显示;
(1) 输出日志方式
① Logger对象
@Service
public class EmployeeServiceImpl implements EmployeeService {
@Autowired
private EmployeeMapper employeeMapper;
private static final Logger logger =
LoggerFactory.getLogger(EmployeeServiceImpl.class); // 用的少
@Override
@Transactional
public void delete(Long id) {
logger.trace("id = " + id);
// 输出日志中有变量可以使用 {} 作为占位符
log.info("删除id为{}的数据", id);
employeeMapper.deleteByPrimaryKey(id);
}
② 注解
@Slf4j log
@Slf4j
@Service
public class DepartmentServiceImpl implements DepartmentService {
@Override
public PageResult<Department> data(QueryObject qo) {
log.trace("当前对象:{} {}", qo.getPageSize(), qo.getCurrentPage());
log.debug("当前对象:{} {}", qo.getPageSize(), qo.getCurrentPage());
log.info("当前对象:{} {}", qo.getPageSize(), qo.getCurrentPage());
}
(2) 修改级别
默认是info级别,若要修改日志级别,最快速的方式是在 application.properties 配置,配置如下
# 把日志级别修改为 debug,不过我们一般不会更改,除非要调试找 bug,不然控制台显示的内容太多也容易乱
logging.level.root=debug
(3) 修改格式
Logback 配置文件的使用 Logback 框架默认会自动加载 classpath:logback.xml,作为框架的配置文件,在 Spring Boot 中使用时,还会额外的支持自动加载classpath:logback-spring.xml,在 Spring Boot 中推荐使用 logback-spring.xml,功能更强大些。需要时百度即可;
9、其他功能
(1) 修改 banner
Spring Boot 提供了一些扩展点,比如修改 banner:在 resources 根目录中放入 banner.txt 文件,替换默认的 banner。
# 关闭banner
spring.main.banner-mode=off
(2) 热部署插件
除了使用 JRebel 来实现热部署,还可以使用 Spring Boot 提供的 spring-boot-devtools 包来完成 Springboot 应用热部署。
<!-- Spring Boot 热部署插件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
Spring Boot 重启是 reload 重启,通过监控 classpath 的变化,如果 classpath 中的文件发生变化,即 触发重启。Spring Boot 通过两个 classpath 来完成 reload,一个 basic classloader 中加载不变的类 (jar 包中的类),一个 restart classloader 中加载 classpath 中的类(自己写的类),重启的时候, restart classloader 中的类丢弃并重新加载。
# 默认排除的资源
spring.devtools.restart.exclude=static/**,templates/**,public/**# 增加额外的排除资源
# 处理默认配置排除之外的
spring.devtools.restart.additional-exclude=public/**# 禁用自动重启
spring.devtools.restart.enabled=false
(3) 切换运行环境
在实际开发中,一个系统是有多套运行环境的,如开发时有开发的环境,测试时有测试的环境,不同的
环境中,系统的参数设置是不同的,如:连接开发数据和测试数据库的 URL 绝对是不同的,那么怎么 快速的切换系统运行的环境呢?我们需要为不同的环境创建不同的配置文件,如下:
# application-dev.properties server.port=8081# application-test.properties server.port=8082# 在 application.properties 中指定需要使用的环境即可 spring.profiles.active=dev