0

アプリケーション コンテキスト ファイルで定義された Bean を使用する Java コマンド ライン アプリケーションがあります。ApplicationContextLoaderメイン メソッドから呼び出される次のクラスを使用して、メイン クラスに Bean を注入できます。

public class ApplicationContextLoader {

    private ConfigurableApplicationContext applicationContext;

    public ConfigurableApplicationContext getApplicationContext() {
        return applicationContext;
    }

    protected void loadApplicationContext(String... configLocations) {
        applicationContext = new ClassPathXmlApplicationContext(configLocations);
        applicationContext.registerShutdownHook();
    }

    protected void injectDependencies(Object main) {
        getApplicationContext().getBeanFactory().autowireBeanProperties(main, AutowireCapableBeanFactory.AUTOWIRE_NO, false);
    }

    public void load(Object main, String... configLocations) {
        loadApplicationContext(configLocations);
        injectDependencies(main);
    }
}

public static void main(String[] args) throws IOException {
        DataGeneratorTestRunner dataGeneratorTestRunner = new DataGeneratorTestRunner();
        dataGeneratorTestRunner.launchTests(args, APPLICATION_CONTEXT);
        System.exit(0);
} 

public void launchTests(String[] args, String applicationContext) throws IOException{
            acl  = new ApplicationContextLoader();      
            acl.load(this, applicationContext);     
}

ただし、@Injectアプリケーション内の他のクラス (メイン クラスではない) で注釈を使用しようとすると、Null ポインター例外が発生します。@Injectクラス名を指定したり、上記の ApplicationContextLoader クラスを使用したりしなくても、アプリケーション全体でアノテーションを使用して、アプリケーション コンテキスト ファイルで定義された任意の Bean を参照 できる代替/簡単な方法はありますか?

アプリケーションのコンテキスト:

<bean id="currentState" class="com.company.integration.sim.State">
</bean>

    <bean id="customerSim" class="com.company.integration.sim.CustomerSim">
    </bean>

null である次のように Bean を参照しています。

public class CustomerSim {

@Inject private State currentState;
.
.
.
4

1 に答える 1

0

AutowiredAnnotationBeanPostProcessor を使用して試すことができます

 protected void injectDependencies(Object main) {
    AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor();
    bpp.setBeanFactory(getApplicationContext());
    bpp.processInjection(main);
  }

あなたが使用している方法がまったく機能するかどうかはわかりません。また、テストを開発する場合は、代わりにSpring Test Context フレームワークを使用することを検討してください。

于 2013-08-28T17:40:05.503 に答える