Spring里遇到的一个问题,autowired时报找不到bean定义

https://www.cnblogs.com/btbear/p/3824960.html


有个工程师,在项目工程里加了些页面和Service,Dao之类,然后启动web工程,Spring一直报错说找不到autowired定义的service接口的实现bean的定义,然后来求助我来帮忙解决。

   我理所当然的按照常规步骤1,2,3...检查他的代码是否存在问题:

  • 第一步,检查service接口是否确实有实现类并且@Service标注了,这个是初学者让出现问题,检查结果确实没问题Pass。

  • 第二布,因为其service定义在新的package里,遂检查其spring配置里,component-scan是否新增加了扫描package,检查结果确实没问题Pass。

  • 第三步,怀疑Eclipse开发环境里,运行tomcat的时候,没有publish成功,确认workspace里是自动build,并且clean & Rebuild,在clean tomcat server,问题依旧。

  • 第四步,还是怀疑Eclipse开发环境里,运行tomcat的时候,没有publish成功,遂检查workspace的的.metadata/.plugins/org.eclipse.wst.server.core里所发布的内容,检查结果确实class已经publish过去没问题,Pass。

  • 第五步,检查Web工程里的Deployment Assembly,配置正确没问题,Pass。

   逐步检查下来,常规的错误貌似都没有犯,但怎么clean,再启动依然报错,找到Service接口,Ctrl+T,确实找到实现类,并且@Service标注。问题查到这里就有点奇怪了,这样问题以前貌似没碰到过。

    有问题不能不解决,继续琢磨,Ctrl+G找Service所有引用,发现有两个地方被使用@Autowared注入,然后,然后,然后,点其中一个引用的地方,Ctrl+T找其实现类,很神奇的发现,光标就跳到引用这个service的类本身上。OMG,Finally,原来该Service的实现Bean在引用自身Service,结果循环引用导致无法实例化Bean而报出这个错误。对于一个中高级工程师来说,犯这个错误,我只能一顿痛扁,挣一顿免费晚餐,你,是否也曾经犯过这个傻呢......Spring里遇到的一个傻问题,autowired时报找不到bean定

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: @autowired报错不到bean通常是因为Spring容器中没有到对应的bean。可能是以下原因导致: 1. 没有在Spring配置文件中声明对应的bean。 2. 声明了对应的bean,但是bean的名称或类型与@autowired注解中的不一致。 3. 声明了对应的bean,但是bean的作用域不是singleton或prototype。 解决方法: 1. 确认Spring配置文件中是否声明了对应的bean,并检查bean的名称和类型是否与@autowired注解中的一致。 2. 确认bean的作用域是否为singleton或prototype。 3. 如果以上方法都无法解决问题,可以尝试使用@ComponentScan注解扫描包路径,确保Spring容器能够扫描到对应的bean。 如果还是无法解决问题,可以提供更详细的报错信息和代码,以便更好地定位问题。 ### 回答2: 当使用 @Autowired 注解时,Spring框架会自动为我们注入相关的 bean,但是如果报错提示不到 bean,则可能是以下几个原因导致的: 1. 没有在配置文件或注解中正确地定义了需要注入的 bean。在使用 @Autowired 注解时,必须确保被注入的 bean 的定义正确无误。可以在配置文件中添加相应的 bean 的定义,或者使用@Component等注解来标识该类为一个 Spring 管理的 bean。 2. 可能存在多个满足条件的 bean。如果存在多个符合自动注入条件的 bean, Spring无法判断注入哪个,就会报错不到 bean。解决方法是使用 @Qualifier 注解来指定具体要注入的 bean 的名称。 3. 扫描包路径不正确。如果扫描的包路径不正确,就可能导致不到相应的 bean。可以在配置文件中添加正确的扫描包路径。 4. 注入的 bean 存在循环依赖。如果 A 类中需要注入 B 类的 bean,而 B 类中又需要注入 A 类的 bean,就会导致循环依赖的情况。可以使用 @Lazy 注解来解决循环依赖的问题。 总之,当遇到@Autowire报错不到 bean时,常见的解决方法为:检查 bean 的定义、使用 @Qualifier 指定具体的 bean、确认扫描包路径是否正确、解决循环依赖问题。希望以上解答对您有帮助! ### 回答3: @autowiredSpring框架中的一个注解,用于自动注入Bean。当使用@autowired注解时,如果报错不到Bean,通常有以下几个可能的原因: 1. 没有在Spring的配置文件或者注解中定义Bean。如果没有在配置文件或注解中声明Bean,并且尝试使用@autowired注解注入该Bean,就会报错不到Bean。 2. Bean命名不正确。在使用@autowired注入Bean时,Spring会根据注解中的类型去容器中查匹配的Bean。如果匹配到多个同类型的Bean或者没有匹配到Bean,会报错不到Bean。 3. 没有扫描到Bean所在的包。如果Bean所在的包没有被Spring扫描到,那么就无法将其作为Bean注册到容器中。可以通过配置扫描包的路径来解决该问题。 4. Bean的作用域设置不正确。如果Bean的作用域设置为prototype,在使用@autowired注解时需要往往在每次调用时都会创建新的实例,如果没有Bean,可能是因为实例已经销毁了。 5. Bean的路径不正确。在使用@autowired注解时,可能是由于使用了错误的路径或者名称导致无法Bean。 解决以上问题,可以采取以下几种方式: 1. 在Spring的配置文件或注解中,正确地定义和配置Bean。 2. 确保使用@autowired注解时,注解中指定的类型唯一匹配具体的Bean。 3. 配置正确的包路径,确保Spring能够扫描到Bean所在的包。 4. 检查Bean的作用域是否正确设置。 5. 确保使用正确的路径或名称来注入Bean。 总之,当使用@autowired注解报错不到Bean时,一般是因为Bean的定义、注解或配置出现了问题,通过以上的解决方案,可以帮助解决该问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值