spring问题:Error creating bean with name 'articleController': Injection of autowired dependencies fail

本文详细分析了在使用Spring框架过程中遇到的Bean注入错误问题,特别是当尝试注入自身类时导致的问题。通过案例研究,作者深入探讨了解决方法,并提醒开发者在实际编程中需要注意避免此类常见错误。

最近在使用spring的注解@Autowired时,出现了以下错误:

ERROR | ContextLoader-initWebApplicationContext [2015-06-12 15:03:46] - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'articleController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.fcy.main.service.ArticleManager com.fcy.main.controller.ArticleController.articleManager; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'articleManager': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.fcy.main.service.ArticleManager com.fcy.main.service.ArticleManager.ArticleManager; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.fcy.main.service.ArticleManager] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:287)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:609)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:469)
	at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:383)
	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:283)
	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4992)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5490)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.fcy.main.service.ArticleManager com.fcy.main.controller.ArticleController.articleManager; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'articleManager': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.fcy.main.service.ArticleManager com.fcy.main.service.ArticleManager.ArticleManager; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.fcy.main.service.ArticleManager] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:506)
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:284)
	... 22 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'articleManager': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.fcy.main.service.ArticleManager com.fcy.main.service.ArticleManager.ArticleManager; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.fcy.main.service.ArticleManager] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:287)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:876)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:818)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:735)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:478)
	... 24 more
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.fcy.main.service.ArticleManager com.fcy.main.service.ArticleManager.ArticleManager; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.fcy.main.service.ArticleManager] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:506)
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:284)
	... 35 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.fcy.main.service.ArticleManager] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:952)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:821)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:735)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:478)
	... 37 more

错误提示有一个bean无法注入,明明只是改动了几行代码,bean怎么就无法注入了呢?在网上找了好久,看到一些解决办法都不能解决我的问题,然后实在没办法了,只好硬着头皮从报错的信息上找原因,看到说“articleController”不能注入,然后就找到了这个类,看了好久,没发现问题;然后继续看报错信息,看到创建“articleManager”出错,找到这个类,看了好久,终于发现了错误,代码如下:

@Repository
public class ArticleManager {
	
	@Autowired
	private ArticleDao articleDao;
	@Autowired    //这里注入了ArticleManager自身,导致创建bean出错        
        private ArticleManager ArticleManager;
	
	public long writeArticle(Article article){
		return this.articleDao.addArticle(article);
	}
         //以下代码省略
}

原来是在类中注入了自身,才导致了错误,赶紧删除这两行,重启tomcat,项目就没有再报错了。

出错总结:在做项目时,将别的类中的一段代码复制了过来,当那段代码中要用到ActicleManager类中的方法时,没去注意看当前类就是ActicleManager,而是直接去注入了ActicleManager对象,这才导致了错误。长期以来,开发工具为我们做了好多事,如实时报错。像这次的情况,并没有语法错误,错误导致的原因也很简单,却很容易让人去忽略这个问题,以后写代码还得多加留心。







在使用Spring框架时,出现 `BeanCreationException: Injection of autowired dependencies failed` 错误通常表明Spring容器无法完成依赖注入。这种问题可能由多种原因引起,以下是一些常见的情况及对应的解决方法: ### 1. Bean未被正确注册为Spring组件 当Spring容器无法找到目标Bean的定义时,会抛出 `NoSuchBeanDefinitionException` 异常。例如,在控制器类中尝试通过自动注入引入服务层Bean(如 `CourseService` 或 `ItemService`)时,如果没有将这些服务类标记为Spring Bean,则会导致注入失败[^2]。 **解决方案:** - 确保所有需要被Spring管理的类都添加了注解,如 `@Service`(用于服务层)、`@Repository`(用于数据访问层)、或 `@Component`(用于通用组件)。 - 检查包扫描路径是否包含这些类所在的包,确保Spring能够扫描到并创建它们的实例。 ### 2. 自动注入字段的类型不匹配 如果存在多个同类型的Bean,但没有指定具体的实现类或使用 `@Qualifier` 注解来区分,Spring将无法确定应该注入哪一个Bean,从而导致注入失败。 **解决方案:** - 使用 `@Autowired` 和 `@Qualifier` 结合的方式明确指定要注入的具体Bean名称。例如: ```java @Autowired @Qualifier("specificServiceImpl") private MyService myService; ``` ### 3. 配置文件中的属性未正确设置 对于需要从配置文件中读取值的场景(如通过 `@Value` 注解),如果配置文件中缺少相应的键值对或者键名拼写错误,也会导致注入失败。 **解决方案:** - 确认配置文件中是否存在所需的键,并且其名称与代码中使用的名称完全一致。 - 如果希望为 `@Value` 设置默认值以防止因缺失配置而导致启动失败,可以按照如下方式设置: ```java @Value("${ruoyi.staticServer:null}") private String staticServer; ``` 这样即使配置文件中没有定义 `ruoyi.staticServer`,该字段也将被赋予默认值 `null` [^3]。 ### 4. 多模块项目中模块间依赖关系未正确配置 在Maven多模块项目中,如果子模块之间的依赖关系没有在 `pom.xml` 文件中正确声明,可能会导致某些模块中的Bean无法被主应用识别和加载。 **解决方案:** - 检查各子模块的 `pom.xml` 文件,确认它们已经被正确地添加为主项目的依赖项。 - 确保每个子模块都包含了必要的Spring Boot插件配置,以便于构建可执行的JAR包。 ### 5. 控制器类本身未被Spring管理 如果控制器类没有被Spring容器管理,那么即使其中的方法或字段使用了 `@Autowired` 注解,也无法成功注入其他Bean。 **解决方案:** - 在控制器类上添加 `@Controller` 或 `@RestController` 注解,确保它被Spring视为一个控制器组件。 ### 示例代码 假设有一个名为 `CommonController` 的控制器类,它依赖于一个名为 `CommonService` 的服务类,下面是正确的实现方式: ```java // CommonService.java @Service public class CommonService { // ... } // CommonController.java @RestController @RequestMapping("/common") public class CommonController { @Autowired private CommonService commonService; // ... } ``` 以上是针对Spring框架中常见的 `BeanCreationException` 异常的一些排查思路和解决办法。如果你能提供更详细的错误日志或项目结构信息,还可以进一步定位具体的问题所在。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值