ここでSpring3.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コンストラクターでそれを自動配線しないのはなぜですか?
それが何をしなければならないかは明らかなようです...