当前位置: 首页 > news >正文

Mapper接口的解析

       @Mapper注解修饰的一个个mapper接口是怎么生效的,它是如何被Spring管理的呢?今天通过简单的配置来实现。

      1)环境准备

package com.example.demo2.b03.mapper;import org.apache.ibatis.annotations.Mapper;/*** @author zhou* @version 1.0* @description TODO* @date 2025/10/5 22:51*/
@Mapper
public interface Mapper1 {
}
package com.example.demo2.b03.mapper;import org.apache.ibatis.annotations.Mapper;/*** @author zhou* @version 1.0* @description TODO* @date 2025/10/5 22:51*/
@Mapper
public interface Mapper2 {
}

         上面提供了两个接口。

2)配置类

     在config配置类里面配置下面两个bean,就可以把两个Mapper接口转换为被Spring管理的bean。

可以看到返回的bean是MapperFactoryBean<Mapper1>。

    @Beanpublic MapperFactoryBean<Mapper1> mapper1(SqlSessionFactory sqlSessionFactory){MapperFactoryBean<Mapper1> factoryBean = new MapperFactoryBean<>(Mapper1.class);factoryBean.setSqlSessionFactory(sqlSessionFactory);return factoryBean;}
    @Beanpublic MapperFactoryBean<Mapper2> mapper2(SqlSessionFactory sqlSessionFactory){MapperFactoryBean<Mapper2> factoryBean = new MapperFactoryBean<>(Mapper2.class);factoryBean.setSqlSessionFactory(sqlSessionFactory);return factoryBean;}

config配置类代码如下:

package com.example.demo2.b03;import com.alibaba.druid.pool.DruidDataSource;
import com.example.demo2.b03.component.Bean2;
import com.example.demo2.b03.mapper.Mapper1;
import com.example.demo2.b03.mapper.Mapper2;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;import javax.sql.DataSource;/*** @author zhou* @version 1.0* @description TODO* @date 2025/10/5 21:46*/
@Configuration
@ComponentScan("com.example.demo2.b03.component")
public class Config {public Bean2 bean2;@Beanpublic Bean1 bean1(){return new Bean1();}@Beanpublic SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();sqlSessionFactoryBean.setDataSource(dataSource);return sqlSessionFactoryBean;}@Bean(initMethod = "init")public DruidDataSource dataSource(){DruidDataSource dataSource = new DruidDataSource();dataSource.setUrl("jdbc:mysql://localhost:3306/test");dataSource.setUsername("root");dataSource.setPassword("root");return dataSource;}@Beanpublic MapperFactoryBean<Mapper1> mapper1(SqlSessionFactory sqlSessionFactory){MapperFactoryBean<Mapper1> factoryBean = new MapperFactoryBean<>(Mapper1.class);factoryBean.setSqlSessionFactory(sqlSessionFactory);return factoryBean;}@Beanpublic MapperFactoryBean<Mapper2> mapper2(SqlSessionFactory sqlSessionFactory){MapperFactoryBean<Mapper2> factoryBean = new MapperFactoryBean<>(Mapper2.class);factoryBean.setSqlSessionFactory(sqlSessionFactory);return factoryBean;}
}

       这里复用了之前的配置类。新添加的两个bean需要传入SqlSessionFactory,它可以由我们上面配置的SqlSessionFactoryBean 产生。

3)主类代码:

package com.example.demo2.b03;import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.annotation.AnnotationBeanNameGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ConfigurationClassPostProcessor;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.MethodMetadata;
import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.stereotype.Component;import java.io.IOException;
import java.util.Set;/*** @author zhou* @version 1.0* @description TODO* @date 2025/10/5 21:43*/
public class A05Application {private static final Logger log = LoggerFactory.getLogger(A05Application.class);public static void main(String[] args) throws IOException {GenericApplicationContext context = new GenericApplicationContext();context.registerBean("config", Config.class);/* context.registerBean(ConfigurationClassPostProcessor.class);//@ComponentScan @Bean @Import注解 @ImportResource注解context.registerBean(MapperScannerConfigurer.class,beanDefinition -> {beanDefinition.getPropertyValues().add("basePackage","com.example.demo2.b03.mapper");});*///context.registerBean(ComponentScanPostProcessor.class);context.registerBean(AtBeanPostProcessor.class);//初始化容器context.refresh();for (String name:context.getBeanDefinitionNames()){System.out.println(name);}//销毁容器context.close();}
}

4)运行结果

           配置的两个Mapper接口被Spring管理,输出的bean的名字是@Bean注解下面方法的名字。Spring容器中存储的是MapperFactoryBean<T>。

       Spring底层是通过这种方式来把mapper接口添加到Spring容器中。但是这种方法不能批量配置mapper接口,该如何改进呢?

http://www.dtcms.com/a/461169.html

相关文章:

  • 网站中链接怎么做的广东网站建设案例
  • 网站开发部门结构公司做网站的费用属于什么费用
  • 做电影方面的网站怎么做外贸免费平台
  • transformers音频实战02-基于 Speech Commands 数据集的语音识别实战项目全流程
  • 天津做网站美工锦州网站建设信息
  • Terraform + RustFS 实战:10分钟实现对象存储 IaC 化,运维效率提升300%
  • 遇到RabbitMQ 的 `channel_max` 限制报错
  • 机器学习实战项目:Python+Flask 汽车销量分析可视化系统(requests爬车主之家+可视化 源码+文档)✅
  • 惠州城乡建设部网站印刷包装公司网站模板
  • WEB前端 JavaScript 学习笔记
  • 如何使用Python实现LRU缓存
  • OSCP渗透实战(第二期):Linux系统攻防与权限提升完全指南
  • LeetCode 118. 杨辉三角
  • AI原生应用架构白皮书 - AI原生应用架构及其关键要素
  • 蓝绿发布与金丝雀发布策略简介_笔记
  • 流媒体视频技术在明厨亮灶场景中的深度应用
  • 建设网站是否需要一个主机全球邮企业邮箱登录
  • 余弦相似度凭什么成了文本推荐的“方向指南针”?从几何夹角到语义匹配的AI密码
  • 解决Docker Hub被封的问题
  • 基于android的中天模拟键盘APP的设计与实现(初稿)
  • 数据结构——十七、线索二叉树找前驱与后继
  • 数据结构-----栈队列
  • 兰州网站制作有哪些怎样下载字体到wordpress
  • 【ASP.NET Core】分布式场景下ASP.NET Core中JWT应用教程
  • C++分布式语音识别服务实践——性能优化与实战部署
  • 【硬核分表】MySQL水平分表全景指南:从策略对比、全局ID到ShardingSphere实战
  • 零基础学AI大模型之Stream流式输出实战
  • Nacos 实战指南:微服务下服务注册与配置管理的完整落地
  • 网站站seo教程深圳有几个区哪个区最富裕
  • 网站seo诊断分析和优化方案企业形象设计课程标准