3

これは本当に基本的なことだと思いますが、Helloworldの後の2番目のステップの例は見つかりませんでした

だから私が持っているのは:

spring-beans.xmlと呼ばれるspringconfigxml:

<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-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">

    <context:annotation-config />
    <context:component-scan base-package="org" />

</beans>

Springコンテキストで初期化されたクラス:

public static void main(String[] args) {
    // initialize Spring
    ApplicationContext context = new ClassPathXmlApplicationContext("META-INF/spring-beans.xml");

    App app = (App) context.getBean("app");
    app.run();
}

AppImplクラスの関連する詳細:

@Component("app")
public final class AppImpl implements App{    

    // focus of question: This autowiring works
    @Autowired
    private DAO1 dao1;


    public void run() {
        //focus of question: This works as daoclass is instantiated properly                   
        obj1s = dao1.myFind();            

        badJobs = runJobs(obj1s);
    }

    private List<Obj1> runJobs(final List<Obj1> obj1s) {        
        List<Obj1> jobsGoneBad = new ArrayList<Obj1>();
        for (Obj1 next : obj1s) {

            // focus of question: usage of new keyword, thus not spring container managed?
            Job job = new JobImpl(next);
            job.run();

        }
        return jobsGoneBad;
    }    
}

JobImplの関連する詳細:

public class JobImpl implements Job {

    private Obj1 obj1;

    // focus of question: can't autowire
    @Autowired
    private DAO2 dao2;

    @Override
    public void run() {
        //focus of question: opDAO == null - not initialized by @Autowired
        Obj2 obj2 = dao2.myFind();        
    }

}

DAO1の関連する詳細:

@Repository("DAO1") //Focus of question: DAO1 is a repository stereotype
public class DAO1 {

    myfind() { ...}
}

DAO2の関連する詳細:

@Repository("DAO2") //Focus of question: DAO2 is a repository stereotype
public class DAO2 {        

    myfind() { ...}
}

そうです、springcontext呼び出しを使用してアプリを初期化し、@Autowiredを使用してDAO1インスタンスを正常にインスタンス化します。

次に、Jobのアンマネージドインスタンスを作成し、@ Autowiredを使用して、そのクラスにも「単一の」依存関係を注入したいと思います。

Daoクラスはどちらも春のステレオタイプであり、スキャナーはそれらを正常に検出します。

だから私の質問は、基本的に、@ Autowiredコンセプトをその中で使用できるように、ジョブインスタンスをどのようにインスタンス化する必要があるかということです。

グローバルにアクセス可能なアプリケーションコンテキストが必要な場合、それをどのように導入するのが最善ですか?

4

4 に答える 4

5

インジェクションなどのSpringBean機能は、SpringマネージドBeanでのみ使用できます。

ただし、@Configurableアノテーションを使用することはできますが、これにはREALAspectJを使用する必要があります。クラスに注釈が付けられている@Configurable(そしてAspectJを使用している)場合、このクラスが通常のによって作成されている場合でも、SpringsInjectionAnnotationsを使用できますnew

@見る

于 2012-10-26T10:42:06.037 に答える
2

SpringBeanはデフォルトでシングルトンです。ただし、必要なのは複数のインスタンスであり、その上に、複数のインスタンスがランタイムを作成しました。

1つの可能性は、これにメソッドインジェクションを使用することです。コンテナから新しいインスタンスを要求するコンテナ対応のジョブファクトリを作成します。

(これらのランタイムインスタンスにDAO参照を挿入する必要があるのは少し厄介だと思います...ロジックを再考してみてください。たとえば、コンストラクター引数でDAO参照を提供できないのはなぜですか。または、別の場所から使用します。daoに、Jobsインスタンスを受け入れるメソッド、JobImplにrunWith(DAO2 dao)のものを入れて、他の場所に注入されたクラス、またはJobProcessorサービスで満足させることができます。 daosを注入し、Jobsインスタンスから関連情報を尋ねます...)

于 2012-10-26T10:40:46.017 に答える
2

JobImplオブジェクトはSpringによって管理されていないため、@ Autowiredは機能していません。そのため、それを注入する機会はありません。SpringマネージドBeanは、コンポーネントのスキャン中またはXML定義でインスタンスが作成されるBeanです。あなたの場合のJobImplは、通常のJavaオブジェクトとしてインスタンス化されています。

1つの解決策は、Springコンテキストで自動配線を手動ルックアップに置き換えることです。

private DAO2 dao2 = SpringApplicationContext.getApplicationContext ().getBean (DAO2.class);

@Autowiredは、@ Componentとして注釈が付けられているため、@AppImplで機能しています。これにより、クラスパススキャン中に春のフラグが立てられ、このクラスのインスタンスが作成され、自動配線/インジェクションが実行されます。

于 2012-10-26T10:41:51.210 に答える
0

@Componentクラスにアノテーションを追加しますJobImpl。このクラスのコンポーネントスキャンをxmlに追加すると、自動配線が機能しますdao2(getter-setterメソッドを提供します)。

于 2012-10-26T10:25:52.967 に答える