Springboot-项目启动加载类

本文探讨了如何在SpringBoot项目中使用CommandLineRunner和ApplicationRunner接口,介绍了它们的启动顺序和应用场景,重点比较了两者在获取参数和执行时机上的异同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

springboot项目启动之后,加载我自定义的配置类的一些方法。

正文

1、 创建自定义类实现 CommandLineRunner接口,重写run()方法。springboot启动之后会默认去扫描所有实现了CommandLineRunner的类,并运行其run()方法。

@Component
@Order(2)   //通过order值的大小来决定启动的顺序
public class AskForLeave implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        askForLeave();
    }

    public void askForLeave(){
        System.out.println("项目启动了,执行了方法");
    }
}

运行结果:

 2、创建自定义类实现ApplicationRunner 接口,重写run()方法。

@Component
@Order(3)
public class Hello implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments args) throws Exception {

        hello();
    }

    public void hello(){
        System.out.println("项目又启动了,这次使用的是:继承 ApplicationRunner");
    }
}

结果如下:

关于二者的区别:

其实并没有什么区别,如果想获取更加详细的参数的时候,可以选择使用ApplicationRunner接口。其参数类型为:ApplicationArguments 。

<think>首先,用户的问题是关于Spring Boot启动时Mapper无法加载的问题。用户明确询问了问题排查及解决方法。我需要参考提供的引用内容,特别是引用[1]和引用[4],因为它们直接涉及MyBatis绑定问题。 关键引用: - 引用[1]:讨论了"Invalid bound statement"错误,这通常与MyBatis配置错误有关,如映射语句绑定问题。 - 引用[4]:描述了BindingException,表明在启动时找不到Mapper,导致无法生成Bean。 其他引用: - 引用[2]:关于Spring Boot加载机制,可能有助于理解依赖冲突。 - 引用[3]:关于自动配置失效问题,可能与依赖冲突或包扫描有关。 用户的问题核心是Spring Boot启动时Mapper无法加载,常见错误是BindingException。我需要提供一个结构清晰的回答,逐步解决问题。 回答结构: 1. **问题分析**:解释为什么会出现Mapper无法加载的问题。 2. **排查步骤**:提供逐步的排查方法。 3. **解决方案**:给出具体的解决方法。 4. **示例代码**:如果适用,提供代码片段。 5. **相关问题**:生成相关问题以扩展讨论。 根据系统级指令: - 使用中文回答。 - 行内数学表达式用$...$,但这里可能不需要数学表达式,除非涉及公式。 - 独立公式用$$...$$,但本主题不涉及。 - 生成相关问题。 - 引用的段落末尾添加引用标识,如[^1]。 参考用户上次的问题:用户提到了"我想Spring Boot项目启动时无法加载Mapper的解决方案",所以我需要聚焦于此。 常见原因: 1. **Mapper接口未扫描**:Spring Boot需要扫描Mapper接口所在的包。 2. **配置错误**:如MyBatis配置文件中未正确映射。 3. **依赖问题**:MyBatis或Spring Boot Starter依赖缺失或冲突。 4. **自动配置问题**:Spring Boot自动配置未生效。 5. **SQL映射文件位置错误**:XML文件未在正确位置。 解决方案: - 确保使用@MapperScan注解扫描Mapper接口。 - 检查pom.xml依赖。 - 验证application.properties配置。 - 检查XML文件路径。 生成相关问题: 1. 如何配置MyBatis多数据源? 2. Spring Boot自动配置失效的原因是什么? 3. 如何处理依赖冲突? 现在,构建回答: - 开头:简要介绍问题。 - 主体:分步骤分析。 - 结尾:总结并提供相关问题。</think>### Spring Boot启动时Mapper无法加载的问题排查及解决方法 在Spring Boot项目中,启动时Mapper无法加载是一个常见问题,通常表现为`org.apache.ibatis.binding.BindingException`异常,如`Invalid bound statement`错误。这会导致Mapper接口无法绑定到SQL映射语句,从而无法生成Bean,影响服务启动[^1][^4]。本问题通常由配置错误、依赖冲突或包扫描问题引起。下面我将逐步分析原因并提供详细的排查和解决方法。 #### 一、问题分析 当Spring Boot启动时Mapper加载失败,核心原因包括: 1. **Mapper接口未被扫描**:Spring Boot未正确扫描到Mapper接口所在的包,导致无法注册Bean。 2. **SQL映射文件位置错误**:XML映射文件未在路径下,或MyBatis无法识别其位置。 3. **依赖冲突或缺失**:MyBatis或Spring Boot Starter依赖版本不兼容或缺失。 4. **自动配置失效**:Spring Boot自动配置未生效,可能由于条件注解限制或包扫描路径错误[^3]。 5. **配置错误**:application.properties或MyBatis配置文件中参数设置不当。 #### 二、排查步骤 按照以下步骤逐步排查问题,避免遗漏: 1. **检查启动日志**: - 启动应用时添加`--debug`参数(如`java -jar your-app.jar --debug`),查看日志中是否有`BindingException`或`NoSuchBeanDefinitionException`错误。 - 重点关注日志中的警告信息,如`No MyBatis mapper was found`或`Skipping auto-configuration`。 2. **验证Mapper接口扫描**: - 确保启动使用`@MapperScan`注解指定Mapper接口的包路径。例如: ```java @SpringBootApplication @MapperScan("com.example.mapper") // 替换为你的Mapper包路径 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` - 如果未使用`@MapperScan`,检查每个Mapper接口是否添加了`@Mapper`注解(但不推荐,因为易遗漏)。 3. **检查SQL映射文件位置**: - XML映射文件(如`UserMapper.xml`)必须位于`src/main/resources`下的正确路径,例如: - 标准位置:`resources/mapper/UserMapper.xml`。 - 在`application.properties`中配置映射文件路径: ```properties mybatis.mapper-locations=classpath:mapper/*.xml ``` - 验证文件是否被正确打包:解压生成的JAR文件,检查XML文件是否存在于`BOOT-INF/classes/mapper/`中。 4. **检查依赖配置**: - 在`pom.xml`中确保添加了必要的依赖: ```xml <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>3.0.3</version> <!-- 使用最新稳定版本 --> </dependency> ``` - 运行`mvn dependency:tree`检查依赖冲突,特别是MyBatis、Spring Boot和数据库驱动版本是否兼容。常见冲突: - MyBatis与MyBatis-Spring版本不匹配。 - 多个日志框架(如Log4j与Logback)冲突,可添加排除: ```xml <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> ``` 5. **验证自动配置**: - Spring Boot自动配置可能因`@ConditionalOnClass`条件未满足而失效[^3]。在`application.properties`中添加: ```properties debug=true ``` 启动后查看日志,搜索`MybatisAutoConfiguration`是否被加载- 如果使用多模块项目,确保公共模块的配置被扫描:在`resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports`文件中添加自动配置[^3]。 6. **测试简单场景**: - 创建一个最小化测试:只保留一个Mapper接口和简单SQL,验证是否仍报错。 - 使用单元测试验证Mapper: ```java @SpringBootTest public class MapperTest { @Autowired private UserMapper userMapper; @Test public void testSelect() { assertNotNull(userMapper.selectById(1)); } } ``` #### 三、解决方案 基于常见原因,提供以下解决方法: 1. **修复包扫描问题**: -启动添加`@MapperScan`,确保路径正确。示例: ```java @MapperScan({"com.example.mapper", "com.example.subpackage.mapper"}) // 支持多个包 ``` 2. **优化XML映射文件配置**: - 在`application.properties`中明确指定映射路径: ```properties mybatis.mapper-locations=classpath*:mapper/**/*.xml ``` - 如果使用MyBatis注解而非XML,确保接口方法使用`@Select`等注解。 3. **解决依赖冲突**: - 更新依赖到兼容版本(如MyBatis-Spring-Boot-Starter 3.x 对应 Spring Boot 3.x)。 - 排除冲突依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> ``` 4. **处理自动配置失效**: - 在模块化项目中,创建`src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports`文件,内容为自动配置全路径: ``` com.example.config.MybatisConfig ``` - 确保配置使用`@Configuration`注解。 5. **常见错误修复**: - 如果错误为`Invalid bound statement`,检查XML中的`namespace`是否与Mapper接口全名一致: ```xml <!-- UserMapper.xml --> <mapper namespace="com.example.mapper.UserMapper"> <select id="selectById" resultType="User"> SELECT * FROM user WHERE id = #{id} </select> </mapper> ``` #### 四、总结 Spring Boot启动时Mapper加载失败通常源于配置疏忽或依赖问题。通过以上步骤,90%的问题可快速解决。关键点包括:正确使用`@MapperScan`、验证XML文件路径、管理依赖树。如果问题依旧,建议使用`--debug`模式分析日志,或参考Spring Boot加载机制深度优化配置[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值