【发布时间】:2012-01-10 05:44:55
【问题描述】:
这里是 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 构造函数中自动装配它?
它必须做什么似乎很明显......
【问题讨论】:
-
如果使用 ApplicationContext 而不是 XmlBeanFactory 会发生什么?我看到 XmlBeanFactory 在 3.1 中已被弃用,也许这就是原因之一。
标签: java spring autowired default-constructor