扩展非容器类的 Autowire 类
Posted
技术标签:
【中文标题】扩展非容器类的 Autowire 类【英文标题】:Autowire class which extends non-container class 【发布时间】:2011-04-19 10:40:21 【问题描述】:我有下一个结构:
@Component public abstract class
HuginJob extends QuartzJobBean ...
@Component("CisxJob") public class
CisxJob extends HuginJob ...
现在我想测试 CisxJob:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/applicationContext-test.xml" )
public class CisxJobTest
@Autowired
@Qualifier("CisxJob")
private CisxJob cisxJob;
.....
这是applicationContext-test.xml
的一部分
<context:annotation-config />
<context:component-scan base-package="no.hugin.jobscheduler" />
错误是
org.springframework.beans.factory.BeanCreationException: 创建名为“no.hugin.jobscheduler.job.cisx.CisxJobTest”的 bean 时出错:自动装配依赖项的注入失败; 嵌套异常是 rg.springframework.beans.factory.BeanCreationException: 无法自动装配字段:私有 no.hugin.jobscheduler.job.cisx.CisxJob no.hugin.jobscheduler.job.cisx.CisxJobTest.cisxJob;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: 没有为依赖找到类型 [no.hugin.jobscheduler.job.cisx.CisxJob] 的匹配 bean: 预计至少有 1 个 bean 有资格作为此依赖项的自动装配候选者。 依赖注解:@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=CisxJob) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:286) ......
问题在于 QuartzJobBean 的扩展 - 但我需要它。
谢谢
【问题讨论】:
您的 bean 是否应用了任何方面(事务性等)? 非常抱歉 - 我修复了帖子。 是的。<context:annotation-config />
<context:component-scan base-package="no.hugin.jobscheduler" />
<aop:aspectj-autoproxy />
<bean id="simpleProfiler" class="no.hugin.jobscheduler.aop.BasicProfiler" />
卡兰巴!!我已经删除了它,它开始工作了!!!!!!但问题是什么?为什么我不能使用方面? BasicProfiler - 只是记录执行时间
【参考方案1】:
问题在于 Spring 生成 AOP 代理的方式。当被代理的类实现了任何接口时,Spring 默认会创建一个 JDK 代理来实现这些接口。
由于QuartzJobBean
实现了一个接口Job
,CisxJob
被代理为Job
,并且该代理不能自动连接到CisxJob
类型的字段。
有两种解决方案:
如果你的 bean 实现了任何接口,也为其业务方法创建一个接口,并将其用作字段类型:
public interface CisxJob ...
@Component("CisxJob")
public class CisxJobImpl extends HuginJob implements CisxJob ...
使用代理目标类模式:
<aop:aspectj-autoproxy proxy-target-class = "true" />
另请参阅:
7.6 Proxying mechanisms【讨论】:
以上是关于扩展非容器类的 Autowire 类的主要内容,如果未能解决你的问题,请参考以下文章
5.1中容器(Container)和门面(Facade)的实现