我有下一个结构:

@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:
无法自动连线栏位:私人编号hugin.jobscheduler.job.cisx.CisxJob
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-但我需要它。

谢谢

最佳答案

问题在于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

07-24 13:44