use*_*022 2 spring components autowired
我有下一个结构:
@Component public abstract class
HuginJob extends QuartzJobBean {...}
@Component("CisxJob") public class
CisxJob extends HuginJob {...}
Run Code Online (Sandbox Code Playgroud)
现在我想测试CisxJob:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"/applicationContext-test.xml" })
public class CisxJobTest {
@Autowired
@Qualifier("CisxJob")
private CisxJob cisxJob;
..... }
Run Code Online (Sandbox Code Playgroud)
这是其中的一部分 applicationContext-test.xml
<context:annotation-config />
<context:component-scan base-package="no.hugin.jobscheduler" />
Run Code Online (Sandbox Code Playgroud)
错误是
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 - 但我需要它.
谢谢
问题在于Spring生成AOP代理的方式.当被代理的类实现任何接口时,Spring默认创建一个实现这些接口的JDK代理.
由于QuartzJobBean实现了一个接口Job,CisxJob被代理为Job,并且该代理不能自动连接到类型的字段CisxJob.
有两种解决方案:
如果您的bean实现任何接口,也为其业务方法创建一个接口,并将其用作字段类型:
public interface CisxJob { ... }
@Component("CisxJob")
public class CisxJobImpl extends HuginJob implements CisxJob {...}
Run Code Online (Sandbox Code Playgroud)使用proxy-target-class模式:
<aop:aspectj-autoproxy proxy-target-class = "true" />
Run Code Online (Sandbox Code Playgroud)也可以看看:
| 归档时间: |
|
| 查看次数: |
4534 次 |
| 最近记录: |