Spring 3.0中出现了一些奇怪的行为。
package com.service.schedule;
import org.springframework.stereotype.Component;
@Component("outroJob")
public class OutroJob {
public void printMe() {
System.out.println("running...");
}
}
和
package com.service.schedule;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;
@Component("testeAutowired")
public class TesteAutowired {
@Autowired
public TesteAutowired(OutroJob outroJob) {
outroJob.printMe();
}
public static void main(String[] args) {
ClassPathResource res = new ClassPathResource("applicationContext.xml");
XmlBeanFactory ctx = new XmlBeanFactory(res);
OutroJob outroJob = (OutroJob) ctx.getBean("outroJob");
outroJob.printMe(); // gives: running...
ctx.getBean("testeAutowired");
}
}
这些bean都没有在applicationContext.xml上声明
所以,行outroJob.printMe();工作正常...打印“正在运行......”
但是当我试图获得“testeAutowired”bean时,它说:
无法实例化bean类 [com.service.schedule.TesteAutowired]:找不到默认构造函数; 嵌套异常是java.lang.NoSuchMethodException: com.service.schedule.TesteAutowired。
问题是:为什么,如果Spring找到了“outroJob”bean,它不会在TesteAutowired构造函数上自动启动它?
显而易见的是......
答案 0 :(得分:1)
尝试使用ApplicationContext而不是XmlBeanFactory。 XmlBeanFactory不会对注释进行后处理,即不使用AutowiredAnnotationBeanPostProcessor来解释您遇到的行为。
答案 1 :(得分:0)
尝试使用
@Autowired(required=true)
public TesteAutowired(OutroJob outroJob) {
outroJob.printMe();
}
这应该强制Spring使用该构造函数。否则,它会构建一个构造函数列表并选择最佳候选者。显然它真的想要一个默认构造函数作为候选者,我想。
答案 2 :(得分:0)
为组件创建一个接口,并尝试使用自动装配的构造函数自动装配接口和nore该类。
答案 3 :(得分:0)
我收到相同的错误消息,但有不同的问题。我正在使用XML配置并将@Autowired
放在类构造函数上。
我通过在XML配置文件中启用注释驱动配置来修复此问题:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:annotation-config/>