1、SpringBoot 拦截器
springmvc 不用再配置扫描包、注解驱动、前端控制器,不玩 jsp 不用写视图解析器
但是要自己写拦截器,步骤如下:
- 自定义拦截器
- 配置自定义的拦截器(添加拦截器配置拦截器路径)
自定义拦截器: 实现 HandlerInterceptor 类,编写前中后三个拦截方法:
public class MyInterceptor implements HandlerInterceptor {
private static final Logger LOGGER = LoggerFactory.getLogger(MyInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
LOGGER.info("preHandle method is running!");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
LOGGER.info("postHandle method is running!");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
LOGGER.info("afterCompletion method is running!");
}
}
配置自定义的拦截器:
因为拦截器不是一个普通属性,而是一个类,所以就要用到 java 配置方式了,是 SpringBoot 的复杂配置。具体流程为:编写一个类,实现 WebMvcConfigurer 接口 复写 addInterceptors(InterceptorRegistry registry) 方法(加入自定义的拦截器,并且配置拦截路径),并且在类上添加 @Configuration 注解。
配置类代码如下:
@Configuration
public class MvcConfig implements WebMvcConfigurer {
// 往拦截器数组中添加我们自定义的拦截器,并且添加拦截路径
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
}
}
2、使用 sl4j 记录日志:
- 使用 LoggerFactory 工厂模式传入当前类字节码创建日志对象,直接调用日志对象相应的日志级别方法做输出即可。因为 SpringBoot 在打印日志时会显示是哪个类记录的日志,所以为了知道哪个类在记录日志,我们在创建日志对象时,需要传入类字节码。
import org.slf4j.Logger;
private static final Logger log = LoggerFactory.getLogger(MyInterceptor.class);
- 但是在每个日志类中都按照如上形式定义 log 常量,相对来说比较繁琐,下面介绍使用 lombok 插件来使用日志
/*
* 在类上添加如下注解。该注解属于 import lombok.extern.slf4j.Slf4j;其内部声明的日志变量名称也是 log
*/
@Slf4j
- 日志记录的形式如下:
SpringMVC 控制日志级别:在配置文件上,配置方式如下:
3、SpringBoot 访问静态资源
SpringBoot 静态资源默认属性查看:
在 WebMvcAutoConfiguration 类中有控制静态资源相关属性的文件:
跟进去会看见 SpringBoot 对 静态资源的相关配置,如:路径等:
从资源路径这个数组常量来看,其默认的静态资源路径有如下几个地方,这些地方的静态资源会被加载:
“META-INF/resources/”,
“classpath:/resources/”,
“classpath:/static/”,
“classpath:/public/
yaml中不识别 * 通配符。故使用时应该用引号括起来。如:”*.xml"
4、SpringBoot 整合 JDBC 和通用 Mapper
- 引入 jdbc 启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
jdbc 启动器内置的是 HikariCP 连接池:
- 引入工程所用的数据库(MySQL)
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
- 配置4大参数:
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/ssm
username: root
password: root
- 导入 mybatis 启动器:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
- 配置 mybatis 驼峰映射
- mybatis默认是属性名和数据库字段名一一对应的,即 :
数据库表列:user_name
实体类属性:user_name - 但是java中一般使用驼峰命名:
数据库表列:user_name
实体类属性:userName - 在Springboot中,可以通过设置map-underscore-to-camel-case属性为true来开启驼峰功能。
在 application.yml 中配置:
mybatis:
configuration:
map-underscore-to-camel-case: true
- 告知 dao 接口的 mapper 文件所在位置:
配置如下:
# 假设 mapper 文件,放置在 resources 包下面
mybatis:
mapper-locations: mapper/*.xml
- 告知 dao 接口 所在位置:
通过 @MapperScan(“com.example.dao”) 注解配置 dao 接口所在地
该注解配置于 SpringBoot 的启动类上面
8. 配置实体类的别名扫描包
type-aliases-package: com.example.pojo
- 在 pom 文件中引入通用 mapper 启动器:(单表的 CRUD 方法不用再编写 )
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.0.3</version>
</dependency>
- 使用通用 mapper 编写 dao 接口:
让 dao 接口继承 Mapper< T > 即可
类中没有定义任何方法,但是观察类结构可以看到,内部继承了很多通用的 CRUD 方法,底层利用 mybatis 可拦截的原理,在底层帮我们把 sql 动态生成,他还带有缓存 sql 语句的功能,不用重复生成 sql 语句。
注意:
1. 此时在第7步导入的 MapScan 注解应该换成使用 通用 Mapper 的 MapScan 注解(删除导入的包,引入通用 Mapper 的包)。这样通用 Mapper 扫描的 dao 接口才会生成该有的通用 CRUD 方法
2. 一旦引入了通用 Mapper 的启动器,会覆盖 Mybatis 官方启动器的功能,一次需要移除在第4步导入的 Mybatis 依赖。 - 在实体类上使用 @Table 注解(让通用 Mapper 生成的通用 CRUD 方法,知道该实体类对应的表名称)。实体类作为主键的属性上面添加 @Id注解,实体类如下:
@Table(name = "account")
public class Account {
@Id
@KeySql(useGeneratedKeys = true)// 该属性用于让自增长的主键回写
private Integer id;
private String name;
private BigDecimal money;
}
补充:可以在不需要持久化的属性上添加 @Transient ,表示该属性是瞬时的,在生成方法时,不会加上该属性
5、SpringBoot 事务管理
该对应的方法添加 @Transactional 注解,则该方法具备事务管理能力