Autowire类扩展了非容器类

时间:2011-04-19 10:40:22

标签: spring components autowired

我有下一个结构:

@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:   无法自动装配字段:private 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可以作为此依赖项的autowire候选者。   依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true),@ org.springframework.beans.factory.annotation.Qualifier(value = CisxJob)}       at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:286)   .............

问题在于扩展QuartzJobBean - 但我需要它。

谢谢

1 个答案:

答案 0 :(得分:6)

问题在于Spring生成AOP代理的方式。当被代理的类实现任何接口时,Spring默认创建一个实现这些接口的JDK代理。

由于QuartzJobBean实现了接口JobCisxJob代理为Job,并且该代理无法自动连接到CisxJob类型的字段

有两种解决方案:

  • 如果您的bean实现了任何接口,也要为其业务方法创建一个接口,并将其用作字段类型:

     public interface CisxJob { ... }
    
     @Component("CisxJob")
     public class CisxJobImpl extends HuginJob implements CisxJob {...} 
    
  • 使用proxy-target-class模式:

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

另见: