Spring要求至少有一个bean符合此依赖项的autowire候选项的条件

Spring要求至少有一个bean符合此依赖项的autowire候选项的条件,spring,dependency-injection,autowired,Spring,Dependency Injection,Autowired,我的自动连线有问题: @Controller public class ChiusuraController { @Autowired private ChiusuraProvider chiusuraProvider; } 使用此bean: @Service @Transactional public class ChiusuraProvider extends ThreadProvider { public void run() {} } 延伸 public

我的自动连线有问题:

@Controller
public class ChiusuraController {

    @Autowired
    private ChiusuraProvider chiusuraProvider;
}
使用此bean:

@Service @Transactional
public class ChiusuraProvider extends ThreadProvider {


    public void run() {}
}
延伸

public abstract class ThreadProvider extends Thread implements InitializingBean, Runnable, DisposableBean {
...
}
我得到这个错误:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'chiusuraController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.cinebot.service.ChiusuraProvider com.cinebot.web.controller.ChiusuraController.chiusuraProvider; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.cinebot.service.ChiusuraProvider] 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)}

我发现,如果我删除autowired类的extends ThreadProvider,我没有收到此错误,但我确实需要ThreadProvider抽象类。

您应该在应用程序上下文中放置这一行:

<context:component-scan base-package="com.cinebot.service" />


.

如果ThreadProvider层次结构中的任何位置都有接口,请尝试将接口的名称作为您的服务提供商的类型,例如,如果您有以下结构:

public class ThreadProvider implements CustomInterface{
...
}
然后在控制器中尝试以下操作:

@Controller
public class ChiusuraController {

    @Autowired
    private CustomInterface chiusuraProvider;
}
发生这种情况的原因是,在第一种情况下,当您没有
ChiusuraProvider
extend
ThreadProvider
Spring时,可能是在为您创建基于CGLIB的代理(以处理@Transaction)

当您确实从
ThreadProvider
进行扩展时,假设ThreadProvider扩展了某个接口,那么Spring会创建一个基于Java动态代理的代理,它似乎是该接口的实现,而不是
ChisuraProvider
类型

如果您确实需要使用
ChisuraProvider
,您可以尝试使用AspectJ作为替代,或者在使用ThreadProvider的情况下强制使用基于CGLIB的代理,也可以通过以下方式:

<aop:aspectj-autoproxy proxy-target-class="true"/>

我添加了这一行,其中ChiusuraProvider包含在包com.cinebot.service中,而ThreadProvider不包含在该包中。。。但它不起作用。你试过@BijuKunjummen的答案吗(使用AOP作用域代理,记得添加CGLIB依赖项)?如果我的类实现了多个接口怎么办?等等。。。你救了我的命。我使用了注释版本@enableAspectProxy(proxyTargetClass=true)。非常感谢。