📖本文目录
📝SpringBoot整合流行框架(上)
🙊0、谈谈想法
因为整合框架的学习是在不断更新迭代的
,众所周知,程序猿的程序世界技术会一直在发展
,版本
也会
一直更新
,如果需要学习新的框架知识,必须要研究好一套属于自己的学习方式
,好的学习方式
,能让你在无穷无尽更新的技术中
,用最有效最适合
的方式快速入门
,这就是我的初衷,这是我的思路与学习框架时的一些感悟吧!希望对初学者,乃至学成者都或多或少有帮助吧,发散一点光芒
,让寒冬不再寒冷
~
📚1、SpringBoot快速整合SpringMVC
SpringBoot已经帮我们整合了以前Spring与SpringMVC配置文件中需要配置的基础了,那我们能做的就是通过找到WebMvcAutoConfiguration
中其被标注了@EnableConfigurationProperties
注解对应mvc的相关配置文件类进行解读
根据配置就好了。
通过查找WebMvcAutoConfiguration
类中的@EnableConfigurationProperties
我们可以找到该类中共出现过三次,如图所示:
从上述的@EnableConfigurationProperties
这个注解可以得知SpringBoot对WebMvc就是依赖这两个东东的
,咱们来逐一进行理解
。
⭐1、WebProperties.class
@ConfigurationProperties("spring.web")
public class WebProperties {
}
从上述我们知道了啥? 这个玩意是可以通过在咱们配置文件properties|yaml
进行对应的配置
,其中的配置前缀
为spring.web
,来咱们就通过去yaml中看看他能配置些什么东东吧~
这个就是webProperties能帮我们进行配置的东东了。
总结起来就一个 webProperties.class
主要就是为了帮助我们处理web程序资源的管控、包括了缓存
、web流程链
、静态资源的存放地址
的控制配置。
但是这个对于初学的同学一般只需要进行配置一个静态资源路径地址
就可以了。
这个webProperties
貌似没有帮我们配置关于什么的SpringMVC的配置,那咱们再来看看另外一个叫做webMvcProperties的配置类。
⭐2、webMvcProperties.class⭐
不出所料看看下面这几行代码你就知道了,茅塞顿开。
@ConfigurationProperties(prefix = "spring.mvc")
public class WebMvcProperties {}
果不其然呢,这个配置类在配置文件中的前缀为spring.mvc那和刚才学习webProperties的思路一样,跟着去application.yaml中进行学习就好了~
以前咱们在xml中的配置现在都能通过一个小小的application.properties|yaml进行了配置,极大地简化了开发
,剩下的就靠自己去理解了
哦~
⭐3、SpringBoot配置拦截器⭐
之前咱们学过的SpringMVC中的拦截器用于对控制器中的方法进行拦截,但是这里的配置文件中并没有提到如何配置拦截器。
在官网我只找到了关于Servlet、Filter、listener这JavaWeb三大组件
是如何进行配置
的,说简单点就是创建bean然后通过@Bean
注解将他们注入到Spring容器
当中,并且对他们进行相关的配置
就好了。
那拦截器,小付也认为是该自己进行配置然后也把这玩意注入到容器
中应该就能使用
了。
说干就干
等等既然是WebMVCConfiguration
那咱们先去看看自动配置类中有没有可能有这个对应的接口配置
,尝试进行配置添加
呢?
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
我们可以看到这么一个注解,在注解当中,这个webmvc自动装配是依赖这几个类的,前两个类大家都了解,那第三个类是啥呢?官网也告诉我们了,你可以通过将类添加上@Configuration 并且该类实现WebMvcConfigurer
接口来进行实现对mvc的扩展配置。
不会扩展配置?没事我教你
:
SpringBoot 与 SpringMVC进行整合扩展 不讲技术只讲学习方法 一文吃透学习框架技巧~
咱们来读读这个WebMvcConfigurer
这个接口实现了什么方法
就知道他能帮我们往spring容器中注入哪些对象
啦~
这一系列能配置的都在接口中的实现展示了,那么现在咱们来尝试配置一个自己的拦截器
吧。
LoginInteceptor.java
/**
* 功能描述
* 登录拦截器设置
* @author Alascanfu
* @date 2022/1/25
*/
public class LoginInterceptor implements HandlerInterceptor {
private Logger logger = LoggerFactory.getLogger(LoginInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logger.debug("拦截器前执行");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
logger.debug("拦截器之后执行");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
logger.debug("跳转之后执行");
}
}
随后咱们通过扩展SpringMVC将咱们自己定制好的Inteceptor添加其中,并且将其注入到Spring容器完成扩展。
/**
* 功能描述
* SpringMVC的扩展
* @author Alascanfu
* @date 2022/1/26
*/
@Configuration
public class WebMVCConfiguration implements WebMvcConfigurer {
/**
* 功能描述
* 将咱们写好的拦截器注入到容器当中
* @date 2022/1/26
* @author Alascanfu
*/
@Bean
public LoginInterceptor loginInterceptor(){
return new LoginInterceptor();
}
/**
* 功能描述
* 注册拦截器并且设置拦截路径
* @date 2022/1/26
* @author Alascanfu
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(this.loginInterceptor()).addPathPatterns("/**");
}
}
工程项目结构
开启日志必须要设置好日志输出级别,在SpringBoot2.x之后设置日志级别,要用新版本的方式了。
logging:
level:
root: debug # 指定日志级别
http://localhost:8080/hello
如图所示,正如我们所设想那样~
📚2、SpringBoot快速整合Mybatis
无论如何先导入依赖才是最重要的QwQ,但是SpringBoot
的官方网站并没有提供
对应的spring-boot-starter
,那它真的不存在吗
?
但是你去搜索,就会发现人家Mybatis自己造
mybatis-spring-boot-autoconfigure – Introduction
既然没有那就自己造就好了塞,这是Mybatis官方自己构造的
学习的所有方式都基本雷同
官方网站已经将很多步骤都已经写出来,我们跟着步骤走就好了呀。
因为小付这里是最新的SpringBoot2.6.3
所以只能导入这个2.2版本的哦~根据自己的SpringBoot版本
导入对应的mybatis-spring-boot-starter
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
⭐1、MybatisAutoConfiguration.java
@Configuration
@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})
@ConditionalOnSingleCandidate(DataSource.class)
@EnableConfigurationProperties({MybatisProperties.class})
@AutoConfigureAfter({DataSourceAutoConfiguration.class, MybatisLanguageDriverAutoConfiguration.class})
public class MybatisAutoConfiguration implements InitializingBean {}
咱们对配置的分析基本上就看两个最主要的注解就好了~
@ConditionalOnClass
与 @EnableConfigurationProperties
因为在@ConditionalOnClass
中囊括的不用我说大家都知道这是spring-mybatis
中最常用的了,通过往容器中注入 SqlSessionFactoryBean
并设置数据源获取 得到SqlSessionFactory
来完成咱们的整合操作。
那这个注解解决完了,再看另一个注解中的类
,咱们没见过但已经能猜测出这玩意能干嘛了!xxxProperties
的配置类可以通过配置文件进行属性注入
,将对象注入到容器
当中。
⭐2、MybatisProperties.class
@ConfigurationProperties(
prefix = "mybatis"
)
public class MybatisProperties {}
映入眼帘的是其对应配置文件中配置类属性的前缀
。老样子咱们去配置文件中试试
就知道Mybatis
与SpringBoot
整合了些啥,为我们简化了哪些配置
。
还有很多很多小付不在举例子了哈,自己阅读会收获更多。
⭐3、SpringBoot整合Mybatis测试⭐
CREATE TABLE `user`(
`id` BIGINT(64) NOT NULL PRIMARY KEY AUTO_INCREMENT,
`username` VARCHAR(32) NOT NULL COMMENT '用户id',
`password` VARCHAR(32) NOT NULL COMMENT '用户账号',
`nameZh` VARCHAR(32) NOT NULL COMMENT '用户密码',
`age` INT NOT NULL COMMENT '用户年龄',
`sex` INT NOT NULL DEFAULT 1 COMMENT '性别:0为女1为男',
`birthday` Date NOT NULL COMMENT '出生日期',
`createdDate` Date NOT NULL COMMENT '账号创建日期',
`updatedDate` Date NOT NULL COMMENT '账号更新日期',
`info` VARCHAR(256) COMMENT '用户简介'
)engine = innodb default charset = utf8;
INSERT INTO `springboot`.`user`(`id`, `username`, `password`, `nameZh`, `age`, `birthday`, `createdDate`, `updatedDate`, `info`) VALUES (1, 'Alascanfu', '123456', '猿小付', 20, '2001-06-10', '2022-01-26', '2022-01-26', '永远年轻,永远热泪盈眶~')
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/springboot?serverTimezone=Asia/Shanghai&characterEncoding=utf-8&useUnicode=true
driver-class-name: com.mysql.cj.jdbc.Driver
User.java
/**
* 功能描述
* 用户类
* @author Alascanfu
* @date 2022/1/26
*/
public class User implements Serializable {
//用户id
private Long id ;
//用户名
private String username;
//用户密码
private String password;
//用户中文名
private String nameZh;
//用户年龄
private Integer age ;
// 性别 0 代表女 1 代表男 默认为男
private Integer sex;
//出生日期
private Date birthday;
//账号创建日期
private Date createdDate;
//账号更新日期
private Date updatedDate;
//用户简介
private String info;
... ...
//此处省略了构造器 以及get/set方法 以及toString()
}
注意点在于需要实现Serializable接口
,因为日期数据传输需要序列化的支持
UserMapper.java
public interface UserMapper {
public List<User> queryAllUsers();
}
UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.alascanfu.mapper.UserMapper">
<select id="queryAllUsers" resultType="com.alascanfu.pojo.User">
select * from user
</select>
</mapper>
- 先导入
SpringBootTest
的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
编写测试类QueryUserTest
@RunWith(SpringRunner.class)
@SpringBootTest
public class QueryUserTest {
@Autowired
UserMapper userMapper;
@Test
public void queryAllUsers(){
for (User user : userMapper.queryAllUsers()) {
System.out.println(user);
}
}
}
不要忘记配置了Mapper映射
哦~
@SpringBootApplication
@MapperScan("com.alascanfu.mapper")
//扫描包下的所有映射 和咱们之前配置Spring-mvc.xml中是一样的意思,这里简化到了SpringBoot程序的启动类了。
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
测试结果如图所示即成功。
中间可能会出现一些以前你犯过的错误哦~自己努努力回忆回忆一下SSM框架配置,以及数据源是否成功注入等问题,例如pom文件中打包是否包含了xml文件
等等
会DEBUG的程序猿不仅能让你少掉几根头发
,当然也还能锻炼你的思维逻辑能力
,找错差错的能力。~
🙊3、小结
本次快速整合的两大框架分别是SpringMVC
和Mybatis
,小付通过对源码的理解
,以及官方参考文献
的阅读的总结整合
,毕竟SpringBoot需要整合那么多好用的框架进行项目开发
,这栏目文章,也会持续更新下去的,主要适合于二刷SpringBoot
框架学习的兄弟姐妹们~对框架的掌握越熟练
,对项目开发的流程也就更清晰明了
,后续会持续更新整合Mybatis-plus、SpringSecurity、Shrio等一系列流行框架和工具。冲冲冲!