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
你好
相关推荐
不吃香菜学java4 小时前
Redis的java客户端
java·开发语言·spring boot·redis·缓存
.Cnn5 小时前
JavaScript 前端基础笔记(网页交互核心)
前端·javascript·笔记·交互
橙露6 小时前
SpringBoot 整合 MinIO:分布式文件存储上传下载
spring boot·分布式·后端
小眼哥6 小时前
SpringBoot整合Vue代码生成exe运行程序以及windows安装包
vue.js·windows·spring boot
九成宫6 小时前
IT项目管理期末复习——Chapter 10 项目沟通管理
笔记·项目管理·软件工程
23471021276 小时前
4.14 学习笔记
笔记·python·学习
一只大袋鼠7 小时前
MyBatis 入门详细实战教程(一):从环境搭建到查询运行
java·开发语言·数据库·mysql·mybatis
sonnet-10298 小时前
函数式接口和方法引用
java·开发语言·笔记
skylijf8 小时前
2026 高项第 6 章 预测考点 + 练习题(共 12 题,做完稳拿分)
笔记·程序人生·其他·职场和发展·软件工程·团队开发·产品经理
今天你TLE了吗8 小时前
LLM到Agent&RAG——AI概念概述 第二章:提示词
人工智能·笔记·后端·学习