1

サービス指向のアプリケーションを作成しようとしています。

memory私はそのように定義されていると呼ばれています:

package com.example.assets;

//imports ignored

@Resource
public class Memory {
}

そして、私は次のmemoryHandlerように定義されたサービスを呼び出しました:

package com.example.service;

//imports ignored

@Service
public class MemoryHandler {

    @Autowired
    private Memory memory;

    public void execute() {
        //do something with memory
    }
}

である別のクラスもありますBeanFactoryPostProcessor

package com.example.service;

//imports ignored

@Component
public class PostProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        beanFactory.getBeansOfType(MemoryHandler.class, false, true);
    }
}

これは Bean を時期尚早に検索し、memoryHandlerインスタンス化されたままにしますが、自動配線されません。ただし、ファクトリによってフェッチされる前に、Bean を自動配線する必要があります。

私の Main クラスでは、次のように書いています。

package com.example.service;

//imports ignored

public class Main {

    public static void main(String[] args) {
        final ApplicationContext context = new ClassPathXmlApplicationContext("/context.xml");
        context.getBean(MemoryHandler.class).execute();
    }

}

NullPointerExceptionはメモリを使って仕事をしています。上記の宣言をセッター インジェクションに置き換えたところ、トレースの結果、インジェクションが発生しないことがわかりました。

両方のコンポーネントの注釈をServiceRepository、およびに変更しましたが、 にComponent置き換えAutowiredResourceも無駄でした。

ここで何が欠けていますか?答えを探して出てきたすべての質問を読みましたが、どれも役に立ちませんでした (そこでResouce注釈の使用に関するヒントを得ました)。

言うまでもなく、Bean のアノテーション構成を見逃していません。

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

さらに、自動配線された Bean がアノテーションではなく XML 構成ファイルで定義されている場合、自動配線は正常に機能します。

Spring 3.2.3.RELEASE を使用しています。

4

1 に答える 1

1

PostProcessor の実装を変更することが重要です。

それ以外の:

public class PostProcessor implements BeanFactoryPostProcessor {

私は書く必要があります:

public class PostProcessor implements ApplicationContextAware {

これにより、後処理される前にコンテキストが完全に取り込まれることが保証されます。これは、私の場合は問題なく機能します。BeanFactoryPostProcessorしかし、通常のインターフェースを使用してこれを行う別の方法があるかどうか疑問に思っていますか?

于 2013-10-05T08:40:38.113 に答える