java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > MyBatis-Plus配置未生效

MyBatis-Plus配置未生效的问题及解决

作者:李少兄

本文主要探讨了在使用MyBatis-Plus进行数据库操作时遇到的问题,包括SQL语句未生效、Mapper接口未扫描、属性未注入、Bean未注册等问题,通过分析SpringBoot的配置类加载机制,本文提出了两种解决方案:添加@Configuration注解和使用AutoConfiguration.imports文件

一、问题背景

在使用 MyBatis-Plus 进行数据库操作时,遇到以下问题:

这个原因可能就是写的配置类没生效,下面详细讲讲

二、问题根源分析

1. Spring Boot 的配置类加载机制

(1)组件扫描(Component Scanning)

触发条件:默认由@SpringBootApplication注解(包含@ComponentScan)触发。

扫描范围:默认扫描主启动类的同包及子包。

识别规则

(2)显式声明(Explicit Declaration)

(3)类路径扫描

Spring Boot启动时,会扫描META-INF/spring.factoriesMETA-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,加载声明的配置类。

2. 问题产生的关键原因

(1) 缺少@Configuration注解

问题:配置类未被 Spring 识别为配置类,导致其 @Bean 方法未被注册。

示例

// 错误示例:缺少 @Configuration
@EnableTransactionManagement
@MapperScan("com.example.mapper")
public class MyBatisConfig {
    @Bean
    public MybatisPlusInterceptor interceptor() { ... }
}

(2) 配置类未被自动加载

(3) 未被组件扫描覆盖

问题:配置类位于主启动类的非扫描路径下,导致Spring无法发现该类。

示例

// 主启动类位于com.example包
@SpringBootApplication
public class Application {}

// 配置类位于com.example.config子包 → 可被扫描
@Configuration
public class MyConfig {}

// 配置类位于com.other包 → 无法被扫描
@Configuration
public class MyOtherConfig {}

三、解决方案一:添加@Configuration注解

1. 解决思路

通过 @Configuration 注解标记配置类,使 Spring Boot 能识别并加载其 @Bean 方法。

2. 核心原理

@Configuration注解

组件扫描机制

3. 实现步骤

(1) 添加注解

@Configuration // 标记为配置类
@EnableTransactionManagement(proxyTargetClass = true)
@MapperScan("${mybatis-plus.mapperPackage}")
@PropertySource(value = "classpath:common-mybatis.yml", factory = YmlPropertySourceFactory.class)
public class MyBatisConfig {
    // 配置拦截器、数据源等
}

(2) 确保组件扫描路径

方式1:配置类位于主启动类的同包或子包中。

方式2:显式指定扫描路径:

@SpringBootApplication
@ComponentScan(basePackages = {"com.example.config"}) // 包含配置类的包路径
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

4. 规范与注意事项

四、解决方案二:使用AutoConfiguration.imports文件

1. 解决思路

通过 AutoConfiguration.imports 文件,强制 Spring Boot 加载指定的配置类,无需依赖组件扫描

2. 核心原理

AutoConfiguration.imports文件

3. 实现步骤

(1) 创建文件

在项目资源目录下创建路径:

src/main/resources/
└── META-INF/
    └── spring/
        └── org.springframework.boot.autoconfigure.AutoConfiguration.imports

(2) 填写内容

文件内容为配置类的全限定名,每行一个:

# 示例:加载 MyBatis 配置类
com.example.config.MyBatisConfig

# 其他配置类(可选)
com.example.config.OtherConfig

(3) 验证文件路径

确保文件路径正确,且无拼写错误(如 META-INF/spring 而非 META-INF/spring.factories)。

4. 规范与注意事项

五、两种方案的对比与选择

方案适用场景优势限制
@Configuration单模块项目,配置类位于主包路径下简单直接,无需额外文件依赖组件扫描路径,多模块时可能冲突
AutoConfiguration.imports多模块项目、第三方库、配置类需独立加载解耦模块,无需修改组件扫描路径需手动创建文件,文件路径需严格符合规范

1. 组合使用场景

在复杂项目中,可结合两者:

@Configuration // 标记配置类
public class MyBatisConfig { ... }

同时在 AutoConfiguration.imports 中声明:

com.example.config.MyBatisConfig

六、原理深入:Spring Boot 的自动配置机制

1. 自动配置流程

启动阶段:Spring Boot 会扫描以下资源:

加载配置类:根据 AutoConfiguration.imports 中的类名,加载对应的配置类。

注册 Bean:解析 @Configuration 类中的 @Bean 方法,注册到 Spring 容器。

2.AutoConfiguration.imports的底层实现

七、常见问题

1. 最佳实践

(1) 多模块项目配置

步骤

在父POM中统一管理依赖:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3</version>
        </dependency>
    </dependencies>
</dependencyManagement>

在配置模块中创建AutoConfiguration.imports,声明配置类:

com.parentmodule.config.MybatisPlusConfig

2. 结合条件注解的动态配置

通过@ConditionalOnProperty实现条件化加载:

@Configuration
@ConditionalOnProperty(prefix = "mybatis-plus", name = "enabled", havingValue = "true")
public class MybatisPlusConfig {
    // 配置内容
}

(2) 第三方库集成

2. 常见问题与解决

(1) 配置类未生效

(2) 文件路径错误

(3) 类名拼写错误

3. 验证配置是否生效

方法1:日志检查

启动日志应包含以下信息:

Loading configuration class 'com.yourpackage.config.MybatisPlusConfig'

方法2:测试Bean注册

在任意@Service@Component中注入配置的Bean:

@Autowired
private MybatisPlusInterceptor interceptor;

@PostConstruct
public void init() {
    System.out.println("Interceptor: " + interceptor);
}

八、完整示例代码

1. 配置类(MyBatisConfig.java)

@Configuration
@EnableTransactionManagement(proxyTargetClass = true)
@MapperScan("${mybatis-plus.mapperPackage}")
@PropertySource(value = "classpath:common-mybatis.yml", factory = YmlPropertySourceFactory.class)
public class MyBatisConfig {

    @Bean
    public MybatisPlusInterceptor interceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }
}

2. AutoConfiguration.imports 文件

# src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
com.example.config.MyBatisConfig

3. 启动类(Application.java)

@SpringBootApplication
@ComponentScan(basePackages = {"com.example"}) // 可选:显式指定扫描路径
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

九、总结

@Configuration 是配置类生效的基础,必须添加。

AutoConfiguration.imports 是加载配置类的机制,适用于复杂项目。

组合使用两者 可以平衡灵活性与解耦性,适应不同场景。

维度@ConfigurationAutoConfiguration.imports
加载机制依赖组件扫描路径无需扫描,直接声明加载
适用场景单模块、路径简单多模块、第三方JAR、复杂路径
性能可能受组件扫描路径影响更高效,仅加载声明的类
依赖关系需确保依赖的Bean已注册需确保依赖的Bean已通过其他方式注册
代码侵入性需修改配置类代码无需修改代码,仅需文件声明

选择建议

Spring Boot版本兼容性

扩展阅读

通过本文的详细讲解,相信读者已能深刻理解配置未生效的原因,并能灵活运用两种解决方案。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文