2024年SpringBoot整合Mybatis及自动装配源码分析,java多线程面试题总结

架构学习资料

准备两个月,面试五分钟,Java中高级岗面试为何越来越难?

准备两个月,面试五分钟,Java中高级岗面试为何越来越难?

准备两个月,面试五分钟,Java中高级岗面试为何越来越难?

准备两个月,面试五分钟,Java中高级岗面试为何越来越难?

准备两个月,面试五分钟,Java中高级岗面试为何越来越难?

由于篇幅限制小编,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

username: root
password: 123456
url: jdbc:mysql:///test_mybatis?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
initialization-mode: always
hikari:
  connection-init-sql: SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci
  connection-timeout: 30000       # 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 默认:30秒
  minimum-idle: 5                 # 最小连接数
  maximum-pool-size: 20           # 最大连接数
  auto-commit: true               # 自动提交
  idle-timeout: 600000            # 连接超时的最大时长(毫秒),超时则被释放(retired),默认:10分钟
  pool-name: DateSourceHikariCP     # 连接池名字
  max-lifetime: 500000           # 连接的生命时长(毫秒),超时而且没被使用则被释放(retired),默认:30分钟 1800000ms
  connection-test-query: SELECT 1

4.  增加实体类 及 Mapper接口

public class User {

private Integer id;

private String username;

private String password;

private String birthday;

… setter getter …

}

public interface UserMapper {

@Select(“select * from user”)

List findAll();

}

5. 启动类中增加Mapper接口扫描

@MapperScan(basePackages=“com.kay.mapper”) // com.kay.mapper根据自己项目自己修改

2. SpringBoot自动装配MyBatis源码分析

  1. @MapperScan注解 本质是将MapperScannerRegistrar导入到容器中,在MapperScannerRegistrar中实现了ImportBeanDefinitionRegistrar接口类及registerBeanDefinitions方法,该方法将在spring实例化之前,调用invokeBeanFactoryPostProcessors 时被调用;

@Import({MapperScannerRegistrar.class})

public @interface MapperScan {

断点 MapperScannerRegistrar 下的 registerBeanDefinitions()方法,观看其调用栈可以验证其调用时机;

在 registerBeanDefinitions中,将

A. 调用doScan(),将指定包下basePackages下所有类信息,封装成BeanDefinition对象存档在IOC容器中,即beanDefinitionMap中;

B.调用processBeanDefinitions(),将mapper接口(GenericBeanDefinition)的beanClass属性为MapperFactoryBean类型并加入到spring的bean容器中;而MapperFactoryBean 实现了FactoryBean; 当后期spring实例化bean容器中对象时,针对于Mapper接口对应的BeanDefinition对象,将调用MapperFactoryBean的getBean()方法;返回 代理对象

public class MapperFactoryBean extends SqlSessionDaoSupport implements FactoryBean {

public T getObject() throws Exception {

return this.getSqlSession().getMapper(this.mapperInterface);

}

}

2. 在mybatis-spring-boot-autoconfigure jar的META-INF/spring.factories中定义了

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\

org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration

@org.springframework.context.annotation.Configuration

@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class })

@ConditionalOnBean(DataSource.class)

@EnableConfigurationProperties(MybatisProperties.class)

@AutoConfigureAfter(DataSourceAutoConfiguration.class)

public class MybatisAutoConfiguration {

@Bean

@ConditionalOnMissingBean

public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {

SqlSessionFactoryBean factory = new SqlSessionFactoryBean();

factory.setDataSource(dataSource);

factory.setVfs(SpringBootVFS.class);

if (StringUtils.hasText(this.properties.getConfigLocation())) {

factory.setConfigLocation(this.resourceLoader.getResource(this.properties.getConfigLocation()));

}

Configuration configuration = this.properties.getConfiguration();

if (configuration == null && !StringUtils.hasText(this.properties.getConfigLocation())) {

configuration = new Configuration();

}

if (configuration != null && !CollectionUtils.isEmpty(this.configurationCustomizers)) {

for (ConfigurationCustomizer customizer : this.configurationCustomizers) {

customizer.customize(configuration);

}

}

factory.setConfiguration(configuration);

if (this.properties.getConfigurationProperties() != null) {

factory.setConfigurationProperties(this.properties.getConfigurationProperties());

}

if (!ObjectUtils.isEmpty(this.interceptors)) {

factory.setPlugins(this.interceptors);

}

if (this.databaseIdProvider != null) {

factory.setDatabaseIdProvider(this.databaseIdProvider);

}

if (StringUtils.hasLength(this.properties.getTypeAliasesPackage())) {

factory.setTypeAliasesPackage(this.properties.getTypeAliasesPackage());

}

if (StringUtils.hasLength(this.properties.getTypeHandlersPackage())) {

factory.setTypeHandlersPackage(this.properties.getTypeHandlersPackage());

}

if (!ObjectUtils.isEmpty(this.properties.resolveMapperLocations())) {

factory.setMapperLocations(this.properties.resolveMapperLocations());

}

return factory.getObject();

}

@Bean

@ConditionalOnMissingBean

public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {

ExecutorType executorType = this.properties.getExecutorType();

if (executorType != null) {

return new SqlSessionTemplate(sqlSessionFactory, executorType);

线程、数据库、算法、JVM、分布式、微服务、框架、Spring相关知识

一线互联网P7面试集锦+各种大厂面试集锦

学习笔记以及面试真题解析

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

1715009024163)]

学习笔记以及面试真题解析

[外链图片转存中…(img-CZN4zFHv-1715009024163)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 24
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值