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
你好
相关推荐
四谎真好看2 小时前
Redis学习笔记(实战篇4)
redis·笔记·学习·学习笔记
鹭天2 小时前
【目标检测学习笔记】 yolov2
笔记·学习·目标检测
一叶飘零_sweeeet2 小时前
吃透 Spring Boot 3 + Spring Cloud 云原生新特性
spring boot·spring cloud·架构
talen_hx2962 小时前
《零基础入门Spark》学习笔记 Day 06
笔记·学习·spark
ai产品老杨2 小时前
源码级赋能:基于Spring Boot/Vue的企业级AI视频平台二次开发实战与架构解析(GB28181/边缘计算/算法商城)
vue.js·人工智能·spring boot
中屹指纹浏览器2 小时前
2026多账号运维中的指纹标准化治理与平台风控适配研究
经验分享·笔记
NULL指向我2 小时前
信号处理学习笔记4:动态调整系数的一阶低通滤波
笔记·学习·信号处理
繁星星繁2 小时前
Python基础语法(一)
c++·笔记·python
xianjian09122 小时前
Java进阶-在Ubuntu上部署SpringBoot应用
java·spring boot·ubuntu