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);
}
}
整合总结
- 导包:web、test、mybatis-starter、mysql、druid
- 配数据源:驱动、url、账号密码、连接池
- 配 MyBatis:指定 xml 文件位置
- 启动类加
@MapperScan扫描 Mapper 接口
02. Spring Boot 自动配置原理
@SpringBootApplication = 三个核心注解组合:
@SpringBootConfiguration@EnableAutoConfiguration(核心)@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(旧版) - 读取所有自动配置类 (如
DataSourceAutoConfiguration、MybatisAutoConfiguration) - 按照配置文件(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 原生的自动配置机制,不需要在启动类上加任何注解。
-
修改
resources/META-INF/spring.factories:properties
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.yunkukukukuku.config.MyBeanConfig -
启动类代码(最简版): 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
你好