5

ここで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コンストラクターでそれを自動配線しないのはなぜですか?

それが何をしなければならないかは明らかなようです...

4

4 に答える 4

1

XmlBeanFactoryの代わりにApplicationContextを使用してみてください。XmlBeanFactoryはアノテーションを後処理しません。つまり、発生している動作を説明するAutowiredAnnotationBeanPostProcessorを使用しません。

ここにもう少し説明があります

于 2011-12-01T01:42:58.407 に答える
0

使ってみて

@Autowired(required=true)
public TesteAutowired(OutroJob outroJob) {
    outroJob.printMe();
}

これにより、Spring はそのコンストラクターを使用するようになります。それ以外の場合は、コンストラクターのリストを作成し、最適な候補を選択します。どうやら、候補としてデフォルトのコンストラクターが本当に必要なようです。

参照: http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.html

于 2011-12-01T01:28:21.050 に答える
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/>
于 2017-01-01T13:19:44.773 に答える