Spring Boot注入报错:找不到DB类型Bean,求解决方案
问题分析与解决方案
错误根源
- @ComponentScan参数错误:你给
@ComponentScan传入的是类的全限定名com.example.test.tutorial.AppConfig,但该注解需要的是包路径,Spring会把这个字符串当作包名去扫描,自然找不到任何组件。 - 冗余注解冲突:
@SpringBootApplication本身已经包含@ComponentScan,默认会扫描主类所在的com.example.test.tutorial包及其子包,额外错误指定@ComponentScan反而覆盖了默认扫描规则,导致配置类和其他组件无法被Spring识别。 - 配置类注解冗余:
@Configuration注解本身就带有@Component的特性,无需在AppConfig上重复添加@Component。
修复方案
方案一:修正主类注解并简化配置类
- 修改
TutorialApplication.java,移除错误的@ComponentScan注解,保留@SpringBootApplication即可:
package com.example.test.tutorial; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class TutorialApplication implements CommandLineRunner { @Autowired(required = true) DB db ; public static void main(String[] args) { SpringApplication.run(TutorialApplication.class, args); } @Override public void run(String... args) throws Exception { System.out.println(db.getDb()); } }
- 简化
AppConfig.java,移除冗余的@Component注解:
package com.example.test.tutorial; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AppConfig { @Bean public DB getDevBean() { return new DevDb(); } }
方案二:直接通过@Component注册Bean(无需配置类)
如果不需要通过配置类控制Bean创建逻辑,可以直接在DevDb上添加@Component注解,Spring会自动扫描并创建Bean:
package com.example.test.tutorial; import org.springframework.stereotype.Component; @Component public class DevDb implements DB { @Override public String getDb() { return "DevDb"; } }
此时可以删除AppConfig类,主类保留@SpringBootApplication即可。
关于朋友机器能运行的说明
大概率是朋友的代码中@ComponentScan参数是正确的包名(比如com.example.test.tutorial),而非类的全限定名;或者IDE的自动编译/配置扫描规则帮他规避了这个问题。
内容的提问来源于stack exchange,提问作者Sudipa Sarkar
相关产品推荐
相关产品推荐

