4

私は、インターフェイス、同じインターフェイスを実装する抽象クラス、およびこのインターフェイスを実装して抽象クラスを拡張する一連の具体的なクラスを持つプロジェクトを持っています。

public interface Invoice
{
   void process();
}

@component
public abstract class AbstractInvoice(){

    @Resource
    protected Writer writer;

    protected validateInvoice(){
        //some implementation
    }
}

@Component
public Class TypeAInvoice() extends AbstractInvoice implements Invoice{

    @Override
    public void process(){
        //... some code
        writer.write();
    }
}

public Interface Writer(){
    public void write();
}

@Component
public class CDWriter implements Writer{
    @Override 
    public void write() { /* implementation.....*/}
}

Spring ファイルには、パッケージのコンポーネント スキャンがあります。

<context:annotation-config>
<context:component-scan base-package="com.xyz" />

TypeAInvoiceインボイスのインスタンスをinvoice.process()取得するためにファクトリを使用しています。write.write()

ここで何が欠けているのかわかりません。コンポーネントのスキャンとスコープを確認しようとしましたが、概念的に間違っているものは見つかりませんでした。

4

3 に答える 3

5

TypeAInvoice 請求書のインスタンスを取得するためにファクトリを使用しています

Factory の動作によっては、これが問題になる場合があります。Factory が新しい を作成する場合TypeAInvoice、Spring ワイヤリングは適用されません。Bean の Spring コンテキストを照会する必要があります。1つの方法(あまりきれいではありませんが)を使用することContextLoaderです:

return ContextLoader.getCurrentWebApplicationContext().getBean(TypeAInvoice.class)

静的ファクトリーとSpringは相性が悪いと思います。Spring は Inversion of Control パターンを表し、Factory は Service Locator パターンを表します。工場を取り除き、Spring Bean を自動配線することをお勧めします。

于 2012-06-30T09:47:08.703 に答える
0

ファクトリを使用して TypeAInvoice を取得することを除けば、すべて問題ありません。TypeAInvoice typer = new TypeAInvoice() のように作成すると、Spring はそれを何も認識せず、Writer は自動配線されず、NullPointerException が発生します。Spring アプリケーション コンテキストから Bean を取得する必要があります。

于 2012-06-30T09:48:28.467 に答える