サービス指向のアプリケーションを作成しようとしています。
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
はメモリを使って仕事をしています。上記の宣言をセッター インジェクションに置き換えたところ、トレースの結果、インジェクションが発生しないことがわかりました。
両方のコンポーネントの注釈をService
、Repository
、およびに変更しましたが、 にComponent
置き換えAutowired
てResource
も無駄でした。
ここで何が欠けていますか?答えを探して出てきたすべての質問を読みましたが、どれも役に立ちませんでした (そこでResouce
注釈の使用に関するヒントを得ました)。
言うまでもなく、Bean のアノテーション構成を見逃していません。
<context:annotation-config/>
<context:component-scan base-package="com.example"/>
さらに、自動配線された Bean がアノテーションではなく XML 構成ファイルで定義されている場合、自動配線は正常に機能します。
Spring 3.2.3.RELEASE を使用しています。