扩展非容器类的 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 是否应用了任何方面(事务性等)? 非常抱歉 - 我修复了帖子。 是的。 &lt;context:annotation-config /&gt;&lt;context:component-scan base-package="no.hugin.jobscheduler" /&gt;&lt;aop:aspectj-autoproxy /&gt;&lt;bean id="simpleProfiler" class="no.hugin.jobscheduler.aop.BasicProfiler" /&gt;卡兰巴!!我已经删除了它,它开始工作了!!!!!!但问题是什么?为什么我不能使用方面? BasicProfiler - 只是记录执行时间 【参考方案1】:

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

由于QuartzJobBean 实现了一个接口JobCisxJob 被代理为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 类的主要内容,如果未能解决你的问题,请参考以下文章

非模板类的模板构造函数出现问题[重复]

swing类的类名都以大写字母啥开头

5.1中容器(Container)和门面(Facade)的实现

Objective-C中的深拷贝和浅拷贝

[Java 并发编程实战] 集合框架之 同步容器类 & 并发容器类

形象解释Swing中顶级容器和中间容器中各个类的意思(最好有实例图片)