18

我对这个 Autowire 有问题:

@Controller
public class ChiusuraController {

    @Autowired
    private ChiusuraProvider chiusuraProvider;
}

用这个豆子:

@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)}

我看到如果我删除自动装配类的扩展 ThreadProvider,我没有得到这个错误 ,但我真的需要 ThreadProvider 抽象类。

4

2 回答 2

19

如果 ThreadProvider 层次结构中的任何地方都有接口,请尝试将接口的名称作为服务提供者的类型,例如。如果你说这个结构:

public class ThreadProvider implements CustomInterface{
...
}

然后在你的控制器中试试这个:

@Controller
public class ChiusuraController {

    @Autowired
    private CustomInterface chiusuraProvider;
}

发生这种情况的原因是,在您没有ChiusuraProvider扩展ThreadProviderSpring 的第一种情况下,可能是为您创建基于 CGLIB 的代理(以处理 @Transaction)。

当您从ThreadProvider假设 ThreadProvider 扩展某个接口进行 DID 扩展时,Spring 在这种情况下会创建一个基于 Java 动态代理的代理,这似乎是该接口的实现而不是ChisuraProvider类型。

如果您绝对需要使用ChisuraProvider,您可以尝试使用 AspectJ 作为替代方案,或者在使用 ThreadProvider 的情况下强制使用基于 CGLIB 的代理,也可以这样:

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

以下是来自 Spring Reference 站点的更多参考:http: //static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/classic-aop-spring.html#classic-aop -pfb

于 2012-07-04T18:56:02.553 回答
7

您应该将此行放在您的应用程序上下文中:

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

在文档中阅读有关自动检测类和注册 bean 定义的更多信息。

于 2012-07-04T16:29:13.250 回答