我的自动线有问题:
@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)}
我看到,如果移除自动连线类的extends-threadprovider,则不会得到此错误,但我确实需要threadprovider抽象类。
最佳答案
如果threadprovider层次结构中的任何位置都有接口,请尝试将接口的名称作为服务提供程序的类型,例如,如果您说过此结构:
public class ThreadProvider implements CustomInterface{
...
}
然后在控制器中尝试以下操作:
@Controller
public class ChiusuraController {
@Autowired
private CustomInterface chiusuraProvider;
}
发生这种情况的原因是,在第一种情况下,当您没有
ChiusuraProvider
extendThreadProvider
spring时,可能是底层为您创建了一个基于cglib的代理(来处理@transaction)。当您扩展到
ThreadProvider
假设线程提供者扩展了一些接口时,Spring在这种情况下创建了一个基于Java动态代理的代理,它似乎是该接口的一个实现,而不是ChisuraProvider
类型。如果您绝对需要使用
ChisuraProvider
您可以尝试使用aspectj作为替代,或者在使用threadprovider的情况下强制使用基于cglib的代理,也可以这样做:<aop:aspectj-autoproxy proxy-target-class="true"/>
以下是Spring参考网站提供的更多参考资料:http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/classic-aop-spring.html#classic-aop-pfb