请查看博客 SpringBoot 介绍与使用了解 Spring 基本介绍与使用
如何使用 springboot 来整合 SSM
1.0 使用 lombok
我们编写 pojo 时, 经常需要编写构造函数和 getter,setter 方法, 属性多的时候, 就非常浪费时间, 使用 lombok 插件可以解决这个问题:
在 idea 中安装 lombok 插件:
需要在 maven 中引入依赖:
- <dependency>
- <groupId>org.project.lombok</groupId>
- <artifactId>lombok</artifactId>
- </dependency>
然后可以在 Bean 上使用:
@Data : 自动提供 getter 和 setter ,hashCode, equals,toString 等方法
@Getter : 自动提供 getter 方法
@Setter: 自动提供 setter 方法
@Slf4j: 自动在 bean 中提供 log 变量, 其实用的是 slf4j 的日志功能
2.1. 整合 SpringMVC
虽然默认配置已经可以使用 SpringMVC 了, 不过我们有时候需要进行自定义配置.
日志级别控制:
- logging:
- level:
- com.jim: debug
- org.springfreamework: debug
2.1.1. 修改端口
查看 SpringBoot 的全局属性可知, 端口通过以下方式配置:
- # 映射端口
- server.port=80
重启服务后测试:
2.1.2. 访问静态资源
现在, 我们的项目是一个 jar 工程, 那么就没有 webapp, 我们的静态资源该放哪里呢?
回顾我们上面看的源码, 有一个叫做 ResourceProperties 的类, 里面就定义了静态资源的默认查找路径:
默认的静态资源路径为:
- classpath:/META-INF/resources/
- classpath:/resources/
- classpath:/static/
- classpath:/public
只要静态资源放在这些目录中任何一个, SpringMVC 都会帮我们处理.
我们习惯会把静态资源放在 classpath:/static / 目录下. 我们创建目录, 并且添加一些静态资源:
重启项目后测试:
2.1.3. 添加拦截器
拦截器也是我们经常需要使用的, 在 SpringBoot 中该如何配置呢?
拦截器不是一个普通属性, 而是一个类, 所以就要用到 java 配置方式了. 在 SpringBoot 官方文档中有这么一段说明:
- If you want to keep Spring Boot MVC features and you want to add additional MVC configuration (interceptors, formatters, view controllers, and other features), you can add your own @Configuration class of type WebMvcConfigurer but without @EnableWebMvc. If you wish to provide custom instances of RequestMappingHandlerMapping, RequestMappingHandlerAdapter, or ExceptionHandlerExceptionResolver, you can declare a WebMvcRegistrationsAdapter instance to provide such components.
- If you want to take complete control of Spring MVC, you can add your own @Configuration annotated with @EnableWebMvc.
翻译:
如果你想要保持 Spring Boot 的一些默认 MVC 特征, 同时又想自定义一些 MVC 配置 (包括: 拦截器, 格式化器, 视图控制器, 消息转换器 等等), 你应该让一个类实现 WebMvcConfigurer, 并且添加 @Configuration 注解, 但是千万不要加 @EnableWebMvc 注解. 如果你想要自定义 HandlerMapping,HandlerAdapter,ExceptionResolver 等组件, 你可以创建一个 WebMvcRegistrationsAdapter 实例 来提供以上组件.
如果你想要完全自定义 SpringMVC, 不保留 SpringBoot 提供的一切特征, 你可以自己定义类并且添加 @Configuration 注解和 @EnableWebMvc 注解
总结: 通过实现 WebMvcConfigurer 并添加 @Configuration 注解来实现自定义部分 SpringMvc 配置.
首先我们定义一个拦截器:
- public class LoginInterceptor implements HandlerInterceptor {
- private Logger logger = LoggerFactory.getLogger(LoginInterceptor.class);
- @Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
- logger.debug("preHandle method is now running!");
- return true;
- }
- @Override
- public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
- logger.debug("postHandle method is now running!");
- }
- @Override
- public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
- logger.debug("afterCompletion method is now running!");
- }
- }
然后, 我们定义配置类, 注册拦截器:
- @Configuration
- public class MvcConfig implements WebMvcConfigurer{
- /**
- * 通过 @Bean 注解, 将我们定义的拦截器注册到 Spring 容器
- * @return
- */
- @Bean
- public LoginInterceptor loginInterceptor(){
- return new LoginInterceptor();
- }
- /**
- * 重写接口中的 addInterceptors 方法, 添加自定义拦截器
- * @param registry
- */
- @Override
- public void addInterceptors(InterceptorRegistry registry) {
- // 通过 registry 来注册拦截器, 通过 addPathPatterns 来添加拦截路径
- registry.addInterceptor(this.loginInterceptor()).addPathPatterns("/**");
- }
- }
结构如下:
接下来运行并查看日志:
你会发现日志中什么都没有, 因为我们记录的 log 级别是 debug, 默认是显示 info 以上, 我们需要进行配置.
SpringBoot 通过 logging.level.*=debug 来配置日志级别,* 填写包名
- # 设置 com.leyou 包的日志级别为 debug
- logging.level.com.leyou=debug
再次运行查看:
- 2018-05-05 17:50:01.811 DEBUG 4548 --- [p-nio-80-exec-1] com.leyou.interceptor.LoginInterceptor : preHandle method is now running!
- 2018-05-05 17:50:01.854 DEBUG 4548 --- [p-nio-80-exec-1] com.leyou.interceptor.LoginInterceptor : postHandle method is now running!
- 2018-05-05 17:50:01.854 DEBUG 4548 --- [p-nio-80-exec-1] com.leyou.interceptor.LoginInterceptor : afterCompletion method is now running!
3. 整合 jdbc 和事务
spring 中的 jdbc 连接和事务是配置中的重要一环, 在 SpringBoot 中该如何处理呢?
答案是不需要处理, 我们只要找到 SpringBoot 提供的启动器即可:
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-jdbc</artifactId>
- </dependency>
当然, 不要忘了数据库驱动, SpringBoot 并不知道我们用的什么数据库, 这里我们选择 MySQL:
- <dependency>
- <groupId>MySQL</groupId>
- <artifactId>MySQL-connector-java</artifactId>
- </dependency>
至于事务, SpringBoot 中通过注解来控制. 就是我们熟知的 @Transactional
- @Service
- public class UserService {
- @Autowired
- private UserMapper userMapper;
- public User queryById(Long id){
- return this.userMapper.selectByPrimaryKey(id);
- }
- @Transactional
- public void deleteById(Long id){
- this.userMapper.deleteByPrimaryKey(id);
- }
- }
4. 整合连接池
其实, 在刚才引入 jdbc 启动器的时候, SpringBoot 已经自动帮我们引入了一个连接池:
HikariCP 应该是目前速度最快的连接池了, 我们看看它与 c3p0 的对比:
因此, 我们只需要指定连接池参数即可:
- # 连接四大参数
- spring.datasource.url=jdbc:MySQL://localhost:3306/heima
- spring.datasource.username=root
- spring.datasource.password=123
- # 可省略, SpringBoot 自动推断
- spring.datasource.driverClassName=com.MySQL.jdbc.Driver
- spring.datasource.hikari.idle-timeout=60000
- spring.datasource.hikari.maximum-pool-size=30
- spring.datasource.hikari.minimum-idle=10
当然, 如果你更喜欢 Druid 连接池, 也可以使用 Druid 官方提供的启动器:
- <!-- Druid 连接池 -->
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>druid-spring-boot-starter</artifactId>
- <version>1.1.6</version>
- </dependency>
而连接信息的配置与上面是类似的, 只不过在连接池特有属性上, 方式略有不同:
- # 初始化连接数
- spring.datasource.druid.initial-size=1
- # 最小空闲连接
- spring.datasource.druid.min-idle=1
- # 最大活动连接
- spring.datasource.druid.max-active=20
- # 获取连接时测试是否可用
- spring.datasource.druid.test-on-borrow=true
- # 监控页面启动
- spring.datasource.druid.stat-view-servlet.allow=true
5. 整合 mybatis
5.1.mybatis
SpringBoot 官方并没有提供 Mybatis 的启动器, 不过 Mybatis 官网 https://github.com/mybatis/spring-boot-starter 自己实现了:
- <!--mybatis -->
- <dependency>
- <groupId>org.mybatis.spring.boot</groupId>
- <artifactId>mybatis-spring-boot-starter</artifactId>
- <version>1.3.2</version>
- </dependency>
配置, 基本没有需要配置的:
- # mybatis 别名扫描
- mybatis.type-aliases-package=com.heima.pojo
- # mapper.xml 文件位置, 如果没有映射文件, 请注释掉
- mybatis.mapper-locations=classpath:mappers/*.xml
需要注意, 这里没有配置 mapper 接口扫描包, 因此我们需要给每一个 Mapper 接口添加 @Mapper 注解, 才能被识别.
- @Mapper
- public interface UserMapper {
- }
5.2. 通用 mapper
通用 Mapper 的作者也为自己的插件编写了启动器, 我们直接引入即可:
- <!-- 通用 mapper -->
- <dependency>
- <groupId>tk.mybatis</groupId>
- <artifactId>mapper-spring-boot-starter</artifactId>
- <version>2.0.2</version>
- </dependency>
注意: 一旦引入通用 Mapper 的启动器, 会覆盖 Mybatis 官方启动器的功能, 因此需要移除对官方 Mybatis 启动器的依赖.
无需任何配置就可以使用了. 如果有特殊需要, 可以到通过 mapper 官网查看.
- public interface UserMapper extends Mapper<User>{
- }
另外, 我们需要把启动类上的 @MapperScan 注解修改为通用 mapper 中自带的:
而且需要对 pojo 类进行添加注解:
注意: 如果对应的属性在 MySQL 的表中没有对应列, 则对该属性添加注解 @Transient
6. 启动测试
将 controller 进行简单改造:
- @RestController
- public class HelloController {
- @Autowired
- private UserService userService;
- @GetMapping("/hello")
- public User hello() {
- User user = this.userService.queryById(8L);
- return user;
- }
- }
我们启动项目, 查看:
来源: https://www.cnblogs.com/jimlau/p/12161824.html