首页 文章

Autowire类扩展了非容器类

提问于
浏览
2

我有下一个结构:

@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)} org.springframework.beans.factory.annotation .AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:286).............

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

谢谢

1 回答

  • 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" />
    

    See also:

相关问题