Spring项目使用component-scan标签时出现NoSuchBeanDefinitionException求助
你遇到的NoSuchBeanDefinitionException核心原因是Spring的组件扫描(component-scan)只会识别带有特定注解的类,你的MoneyService没有添加这类注解,所以没被自动注册成Bean。
具体解决步骤:
给MoneyService添加服务类注解
Spring的component-scan需要类上标注@Component或其衍生注解(@Service、@Repository、@Controller)才会将类纳入容器管理。因为MoneyService是业务服务类,用@Service更符合语义:import org.springframework.stereotype.Service; @Service public class MoneyService { public void perform(Operation operation) { … } }确认组件扫描路径有效性
你的XML配置里base-package="com.example"是正确的,因为MoneyService在com.example.services子包下,component-scan会递归扫描所有子包,这部分不用修改。Bean名称匹配验证
如果你没有在@Service里指定自定义名称(比如@Service("myMoneyService")),Spring默认会把类名首字母小写作为Bean名称(MoneyService→moneyService),你代码里getBean("moneyService")的写法是正确的,只要类被扫描到就能正常获取。
补充说明
你直接加<bean>标签能正常运行,是因为这种方式是显式注册Bean,不需要依赖注解,Spring会直接根据标签配置创建实例。而component-scan是基于注解的自动扫描机制,必须配合组件注解才能生效,这就是两者的区别。
内容的提问来源于stack exchange,提问作者Andryss

