Spring注解方式整合Mybatis 📅 发布时间:2026/7/7 8:07:19 👁️ 浏览次数: Spring注解方式整合Mybatis一、概述二、实验2.1注入数据源的各属性先引入配置文件PropertySource(classpath:jdbc.properties)再是注入属性Value(${jdbc.driver})StringdriverClassName;Value(${jdbc.url})Stringurl;Value(${jdbc.username})Stringusername;Value(${jdbc.password})Stringpassword;2.2创建数据源且注册成为BeanBeanpublicDataSourcedataSource(){DruidDataSourcedataSourcenewDruidDataSource();dataSource.setDriverClassName(driverClassName);dataSource.setUsername(username);dataSource.setPassword(password);dataSource.setUrl(url);returndataSource;}2.3创建SqlSessionFactoryBean且注册成为BeanpublicSqlSessionFactoryBeansqlSessionFactoryBean(DataSourcedataSource){// SqlSessionFactoryBean sqlSessionFactoryBean sqlSessionFactoryBean(dataSource);SqlSessionFactoryBeansqlSessionFactoryBeannewSqlSessionFactoryBean();sqlSessionFactoryBean.setDataSource(dataSource);returnsqlSessionFactoryBean;}2.4设置接口扫描ComponentScan(com.itheima)总的配置类里面含有xml配置的对照packagecom.itheima.config;importcom.alibaba.druid.pool.DruidDataSource;importcom.itheima.beans.OtherBean3;importorg.mybatis.spring.SqlSessionFactoryBean;importorg.mybatis.spring.annotation.MapperScan;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.context.annotation.*;importjavax.sql.DataSource;//这个注解代表这是一个核心配置类这个类交给了Spring容器管理就是相当于替换Spring配置文件Configuration//context:component-scan base-packagecom.itheima/配置注解扫描只有一个时直接写有多个写成数组ComponentScan(com.itheima)//context:property-placeholder locationclasspath:jdbc.properties/引入配置文件PropertySource(classpath:jdbc.properties)// import resource导入其他配置类Import(OtherBean3.class)//下面是接口扫描// bean classorg.mybatis.spring.mapper.MapperScannerConfigurer//!-- 指定要扫描的包--// property namebasePackage valuecom.itheima.mapper/property// /beanMapperScan(com.itheima.mapper)publicclassSpringConfig2{Value(${jdbc.driver})StringdriverClassName;Value(${jdbc.url})Stringurl;Value(${jdbc.username})Stringusername;Value(${jdbc.password})Stringpassword;// bean iddataSource classcom.alibaba.druid.pool.DruidDataSource// property namedriverClassName value${jdbc.driver}/// property nameurl value${jdbc.url}/// property nameusername value${jdbc.username}/// property namepassword value${jdbc.password}/// /beanBeanpublicDataSourcedataSource(){DruidDataSourcedataSourcenewDruidDataSource();dataSource.setDriverClassName(driverClassName);dataSource.setUsername(username);dataSource.setPassword(password);dataSource.setUrl(url);returndataSource;}// bean classorg.mybatis.spring.SqlSessionFactoryBean//!-- 最终是要得到由Sqlsession得到Conection需要数据源属性--// property namedataSource refdataSource/property// /beanBean// 在这里是通过类型进行注入的publicSqlSessionFactoryBeansqlSessionFactoryBean(DataSourcedataSource){// SqlSessionFactoryBean sqlSessionFactoryBean sqlSessionFactoryBean(dataSource);SqlSessionFactoryBeansqlSessionFactoryBeannewSqlSessionFactoryBean();sqlSessionFactoryBean.setDataSource(dataSource);returnsqlSessionFactoryBean;}}结果三、原理剖析先是进入MapperScan看看里面MapperScan(com.itheima.mapper)//// Source code recreated from a .class file by IntelliJ IDEA// (powered by FernFlower decompiler)//packageorg.mybatis.spring.annotation;importjava.lang.annotation.Annotation;importjava.lang.annotation.Documented;importjava.lang.annotation.ElementType;importjava.lang.annotation.Repeatable;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;importorg.mybatis.spring.mapper.MapperFactoryBean;importorg.springframework.beans.factory.support.BeanNameGenerator;importorg.springframework.context.annotation.Import;Retention(RetentionPolicy.RUNTIME)Target({ElementType.TYPE})DocumentedImport({MapperScannerRegistrar.class})Repeatable(MapperScans.class)publicinterfaceMapperScan{String[]value()default{};String[]basePackages()default{};Class?[]basePackageClasses()default{};Class?extendsBeanNameGeneratornameGenerator()defaultBeanNameGenerator.class;Class?extendsAnnotationannotationClass()defaultAnnotation.class;Class?markerInterface()defaultClass.class;StringsqlSessionTemplateRef()default;StringsqlSessionFactoryRef()default;Class?extendsMapperFactoryBeanfactoryBean()defaultMapperFactoryBean.class;StringlazyInitialization()default;}我们发现它导入了一个MapperScannerRegistrar继续跟进voidregisterBeanDefinitions(AnnotationMetadataannoMeta,AnnotationAttributesannoAttrs,BeanDefinitionRegistryregistry,StringbeanName){BeanDefinitionBuilderbuilderBeanDefinitionBuilder.genericBeanDefinition(MapperScannerConfigurer.class);builder.addPropertyValue(processPropertyPlaceHolders,true);Class?extendsAnnotationannotationClassannoAttrs.getClass(annotationClass);if(!Annotation.class.equals(annotationClass)){builder.addPropertyValue(annotationClass,annotationClass);}然后注册了一个MapperScannerConfigurer.class是不是好熟悉啊其实到这就是与xml配置一样了都是通过MapperScannerConfigurer.class来注册只不过注解方式还导入了一个MapperScannerRegistrar再由MapperScannerRegistrar注册MapperScannerConfigurer.class而xml方式是直接配置MapperScannerConfigurer.class。当然我们也还可以发现BeanDefinitionBuilder.genericBeanDefinition(MapperScannerConfigurer.class);BeanDefinitionBuilder也是可以注册BeanDefinition的以前我们都是通过new RootBeanDefinition()然后由BeanDefinitionRegistry注册现在又发现一种方式。publicvoidpostProcessBeanDefinitionRegistry(BeanDefinitionRegistryregistry){if(this.processPropertyPlaceHolders){this.processPropertyPlaceHolders();}ClassPathMapperScannerscannernewClassPathMapperScanner(registry);scanner.setAddToConfig(this.addToConfig);scanner.setAnnotationClass(this.annotationClass);scanner.setMarkerInterface(this.markerInterface);scanner.setSqlSessionFactory(this.sqlSessionFactory);scanner.setSqlSessionTemplate(this.sqlSessionTemplate);scanner.setSqlSessionFactoryBeanName(this.sqlSessionFactoryBeanName);scanner.setSqlSessionTemplateBeanName(this.sqlSessionTemplateBeanName);scanner.setResourceLoader(this.applicationContext);scanner.setBeanNameGenerator(this.nameGenerator);scanner.setMapperFactoryBeanClass(this.mapperFactoryBeanClass);if(StringUtils.hasText(this.lazyInitialization)){scanner.setLazyInitialization(Boolean.valueOf(this.lazyInitialization));}scanner.registerFilters();scanner.scan(StringUtils.tokenizeToStringArray(this.basePackage,,; \t\n));}看吧依然是调用postProcessBeanDefinitionRegistry的scanner.scan(StringUtils.tokenizeToStringArray(this.basePackage, “,; \t\n”));然后进入scan方法protectedSetBeanDefinitionHolderdoScan(String...basePackages){Assert.notEmpty(basePackages,At least one base package must be specified);SetBeanDefinitionHolderbeanDefinitionsnewLinkedHashSet();for(StringbasePackage:basePackages){for(BeanDefinitioncandidate:this.findCandidateComponents(basePackage)){ScopeMetadatascopeMetadatathis.scopeMetadataResolver.resolveScopeMetadata(candidate);candidate.setScope(scopeMetadata.getScopeName());StringbeanNamethis.beanNameGenerator.generateBeanName(candidate,this.registry);if(candidateinstanceofAbstractBeanDefinition){this.postProcessBeanDefinition((AbstractBeanDefinition)candidate,beanName);}if(candidateinstanceofAnnotatedBeanDefinition){AnnotationConfigUtils.processCommonDefinitionAnnotations((AnnotatedBeanDefinition)candidate);}if(this.checkCandidate(beanName,candidate)){BeanDefinitionHolderdefinitionHoldernewBeanDefinitionHolder(candidate,beanName);definitionHolderAnnotationConfigUtils.applyScopedProxyMode(scopeMetadata,definitionHolder,this.registry);beanDefinitions.add(definitionHolder);this.registerBeanDefinition(definitionHolder,this.registry);}}}returnbeanDefinitions;}同样是先注册BeanDefinitionHolder然后注册BeanDefinition放到BeanDefinitionMap中核心代码都是完全一样的。
OpenClaw 工具策略配置完全指南 OpenClaw 工具策略配置完全指南 目录 概述 工具策略架构 配置文件(Profile) 基础策略配置 高级策略配置 网络工具配置 执行工具配置 沙箱策略 2026/5/17 5:07:24
基础入门 Flutter for OpenHarmony:battery_plus 电池状态监控详解 欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net 🎯 欢迎来到 Flutter for OpenHarmony 社区!本文将深入讲解 Flutter 中 battery_plus 电池状态监控插件的使用方法,带你全面掌握获取电池电量、电池状态、… 2026/5/17 5:07:24
适用于室内和室外的集成式LED PCBA解决方案 Cree LED的Level 2(L2)解决方案组合提供完全组装的LEDPCB组件,可降低复杂性、缩短开发周期,并支持长期生产计划。L2 PCB组件专为各类室内外照明应用而设计,为制造商提供来自单一全球供应商的可靠、即刻投入生产的平台。… 2026/5/17 5:07:23
硅谷的尽头是编制,OpenAI要给白宫送5%的股权 刚刚,英国《金融时报》扔出炸雷:OpenAI 提议,让白宫持有公司5%的股权。 按估值8520亿美元算,5%就是 426 亿美元。 无偿、白送。 这妥妥的保护费啊,因为OpenAI的政府关系眼下四面漏风: 上个月,… 2026/7/7 8:06:08
OpenSSL实战HMAC:API安全与数据完整性验证全解析 1. 项目概述:为什么HMAC是API安全与数据完整性的基石如果你正在开发一个需要对外提供API接口的服务,或者正在设计一个需要确保数据在传输过程中不被篡改的系统,那么HMAC(基于哈希的消息认证码)是你绕不开的核心技术。我… 2026/7/7 8:06:08
IDM激活脚本:三步永久解锁下载管理器,告别试用期限制 IDM激活脚本:三步永久解锁下载管理器,告别试用期限制 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 还在为Internet Download Manager试… 2026/7/7 8:04:08
探索Ryujinx:如何用开源C技术打造高精度Switch模拟器 探索Ryujinx:如何用开源C#技术打造高精度Switch模拟器 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx 你是否曾梦想在个人电脑上体验任天堂Switch的独家游戏?是… 2026/7/7 8:04:08
百度网盘macOS破解插件终极指南:解锁SVIP与速度限制的完整解决方案 百度网盘macOS破解插件终极指南:解锁SVIP与速度限制的完整解决方案 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 你是否曾经面对百度网盘… 2026/7/7 8:04:08
碧蓝航线Alas脚本:5分钟实现全自动游戏管理的终极指南 碧蓝航线Alas脚本:5分钟实现全自动游戏管理的终极指南 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研,全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript 还在为碧蓝… 2026/7/7 8:00:07
Acunetix v24.8 深度解析:DAST漏洞扫描器核心原理与DevSecOps实践 1. 项目概述:Acunetix v24.8 高级版漏洞扫描器深度解析作为一名在网络安全领域摸爬滚打多年的老兵,我深知一款趁手的“兵器”对于安全测试工作意味着什么。今天要聊的,就是Web应用安全测试领域里一个响当当的名字——Acunetix。特别是其v24.8… 2026/7/7 0:01:11
如何3步搞定加密视频下载:跨平台资源嗅探与解密工具终极指南 如何3步搞定加密视频下载:跨平台资源嗅探与解密工具终极指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 你是… 2026/7/7 0:03:13
Jailhouse-gui可视化管理工具:让多核处理器分区变得简单高效 Jailhouse-gui可视化管理工具:让多核处理器分区变得简单高效 【免费下载链接】Jailhouse-gui A graphical user interface (GUI) tool for configuring and managing Jailhouse, a Linux-based hypervisor for partitioning multicore processors into isolated cel… 2026/7/7 0:03:13
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/6 8:43:22
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/6 7:29:49
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/6 7:29:51