Spring Boot (整合 Mybatis + 自动配置原理)

01. Spring Boot 整合 MyBatis(标准步骤)

1. 依赖(pom.xml)

必须引入这 5 个核心依赖:

xml

复制代码
<!-- web开发 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 测试 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<!-- MyBatis整合SpringBoot官方starter -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.2</version>
</dependency>
<!-- MySQL驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>
<!-- 德鲁伊连接池 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.8</version>
</dependency>

2. 配置文件(application.yml)

yaml/ yml

复制代码
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver  # MySQL5驱动;8版本对应:com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/springboot  # 数据库名
    username: root
    password: 密码
    type: com.alibaba.druid.pool.DruidDataSource  # 指定连接池类型

# MyBatis 配置:扫描Mapper.xml映射文件
mybatis:
  mapper-locations: classpath:mapper/*.xml

3. 启动类

java

运行

复制代码
@SpringBootApplication
@MapperScan("com.yunkukukukuku.mapper") // 扫描Mapper接口包,自动生成代理对象
public class MybatisApp {
    public static void main(String[] args) {
        SpringApplication.run(MybatisApp.class, args);
    }
}

整合总结

  1. 导包:web、test、mybatis-starter、mysql、druid
  2. 配数据源:驱动、url、账号密码、连接池
  3. 配 MyBatis:指定 xml 文件位置
  4. 启动类加@MapperScan扫描 Mapper 接口

02. Spring Boot 自动配置原理

@SpringBootApplication = 三个核心注解组合:

  1. @SpringBootConfiguration
  2. @EnableAutoConfiguration(核心)
  3. @ComponentScan

1. @SpringBootConfiguration

  • 本质是 @Configuration
  • 作用:标记启动类是 Spring 的配置类
  • 可以在启动类中用@Bean注册对象

2. @EnableAutoConfiguration(自动配置核心)

由两个注解组成:

@AutoConfigurationPackage
  • 作用:自动扫描【启动类所在包及其子包】
  • 把包下所有@Controller/@Service/@Component等类创建 Bean,放入 IOC 容器
@Import(AutoConfigurationImportSelector.class)
  • 加载 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports(新版)/spring.factories(旧版)
  • 读取所有自动配置类 (如DataSourceAutoConfigurationMybatisAutoConfiguration
  • 按照配置文件(yml)中的参数,自动完成 Bean 创建✅ 例子:你只配了数据库连接信息,SpringBoot 自动创建 DataSource、SqlSessionFactory 等 Bean

3. @ComponentScan

  • 作用:指定 Spring 要扫描的包路径
  • 默认:扫描启动类所在包及子包
  • 可以手动配置:@ComponentScan("com.hg") 扩大扫描范围

03.自动配置

复制代码
package com.yunkukukukuku.bean;

public class Mybean {
    public void mybean(){
        System.out.println("你好");
    }
}

package com.yunkukukukuku.config;

import com.yunkukukukuku.bean.Mybean;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.RequestMapping;

public class MyBeanConfig {
    @Bean
    public Mybean mybeanConfig(){
        return new Mybean();
    }
}

方式 1:直接 @Import 配置类

直接导入 MyBeanConfig 配置类,最基础的方式。

java

运行

复制代码
package com.yunkukukukuku;

import com.yunkukukukuku.bean.Mybean;
import com.yunkukukukuku.config.MyBeanConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Import;

@SpringBootApplication
@Import(MyBeanConfig.class) // 直接导入配置类
public class SpringbootAutoConfiguration {
    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(SpringbootAutoConfiguration.class, args);
        Mybean mybeanConfig = run.getBean("mybeanConfig", Mybean.class);
        System.out.println(mybeanConfig);
        mybeanConfig.mybean();
    }
}

方式 2:@Import 导入 ImportSelector 实现类

通过 MyImportSelector 读取 spring.factories 来动态加载配置类。

复制代码
package com.yunkukukukuku;

import com.yunkukukukuku.bean.Mybean;
import com.yunkukukukuku.config.MyImportSelector;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Import;

@SpringBootApplication
@Import(MyImportSelector.class) // 导入ImportSelector实现类
public class SpringbootAutoConfiguration {
    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(SpringbootAutoConfiguration.class, args);
        Mybean mybeanConfig = run.getBean("mybeanConfig", Mybean.class);
        System.out.println(mybeanConfig);
        mybeanConfig.mybean();
    }
}

java

运行

复制代码
package com.yunkukukukuku;

import com.yunkukukukuku.bean.Mybean;
import com.yunkukukukuku.config.MyImportSelector;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Import;

@SpringBootApplication
@Import(MyImportSelector.class) // 导入ImportSelector实现类
public class SpringbootAutoConfiguration {
    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(SpringbootAutoConfiguration.class, args);
        Mybean mybeanConfig = run.getBean("mybeanConfig", Mybean.class);
        System.out.println(mybeanConfig);
        mybeanConfig.mybean();
    }
}

注意:需要确保 resources/META-INF/spring.factories 存在且内容为:

plaintext

复制代码
com.yunkukukukuku.config.MyBeanConfig

方式 3:使用自定义注解 @MyEnableAutoConfiguration

封装 @Import(MyImportSelector.class) 到自定义注解,更优雅。

java

运行

复制代码
package com.yunkukukukuku;

import com.yunkukukukuku.bean.Mybean;
import com.yunkukukukuku.config.MyEnableAutoConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
@MyEnableAutoConfiguration // 使用自定义自动配置注解
public class SpringbootAutoConfiguration {
    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(SpringbootAutoConfiguration.class, args);
        Mybean mybeanConfig = run.getBean("mybeanConfig", Mybean.class);
        System.out.println(mybeanConfig);
        mybeanConfig.mybean();
    }
}

方式 4:模拟 Spring Boot 原生自动配置(spring.factories 方式)

利用 Spring Boot 原生的自动配置机制,不需要在启动类上加任何注解

  1. 修改 resources/META-INF/spring.factories

    properties

    复制代码
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    com.yunkukukukuku.config.MyBeanConfig
  2. 启动类代码(最简版): java

    运行

    复制代码
    package com.yunkukukukuku;
    
    import com.yunkukukukuku.bean.Mybean;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.ConfigurableApplicationContext;
    
    @SpringBootApplication // 无需额外注解,Spring Boot自动读取spring.factories
    public class SpringbootAutoConfiguration {
        public static void main(String[] args) {
            ConfigurableApplicationContext run = SpringApplication.run(SpringbootAutoConfiguration.class, args);
            Mybean mybeanConfig = run.getBean("mybeanConfig", Mybean.class);
            System.out.println(mybeanConfig);
            mybeanConfig.mybean();
        }
    }

四种方式对比

表格

方式 核心注解 / 机制 优点 缺点
1 @Import(MyBeanConfig.class) 简单直观,适合小项目 硬编码,不够灵活
2 @Import(MyImportSelector.class) 动态加载,可配置化 需要手动维护 spring.factories
3 @MyEnableAutoConfiguration 封装性好,代码优雅 本质还是方式 2,只是封装
4 spring.factories + @SpringBootApplication 完全模拟 Spring Boot 原生机制,无侵入 依赖文件路径,调试稍复杂

运行结果

四种方式最终都会输出:

plaintext

复制代码
com.yunkukukukuku.bean.Mybean@xxxxxxx
你好
相关推荐
Tutankaaa10 分钟前
知识竞赛计分如何确保绝对准确?双机热备方案详解与实施要点
笔记·学习·职场和发展
spencer_tseng1 小时前
Spring Boot 3.0+ jakarta.*
java·spring boot
PRINT!2 小时前
个人财富全景管理系统 AssetMe【内容均为AI制作】
spring boot·信息可视化·ai编程
qq_429499572 小时前
RK3566 linux编译成功笔记
笔记
jay神3 小时前
基于SpringBoot的宠物生命周期信息管理系统
java·数据库·spring boot·后端·web开发·宠物·管理系统
Purple Coder3 小时前
项目一支撑文档阅读笔记-《Handbook on Battery Energy Storage System》
笔记
万亿少女的梦1683 小时前
基于SpringBoot的在线考试管理系统设计与实现
java·spring boot·后端
宵时待雨3 小时前
linux笔记归纳4:进程概念
linux·运维·服务器·c++·笔记
范什么特西4 小时前
第一个Mybatis
java·开发语言·mybatis
下次再写4 小时前
【Redis实战】深入理解Redis缓存策略:从原理到Spring Boot实践
java·spring boot·redis·缓存穿透·缓存击穿·分布式缓存·缓存策略