@Inject不从应用程序上下文中注入Bean

时间:2013-08-28 15:09:23

标签: spring dependency-injection

我有一个java命令行应用程序,它利用应用程序上下文文件中定义的Beans。我可以使用从main方法调用的以下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);     
}

但是,当我尝试在我的Application(而不是Main类)中的其他类中使用@Inject注释时,我得到Null指针异常。是否有一种替代/更简单的方法允许我在我的应用程序中使用@Inject注释来引用我的应用程序上下文文件中定义的任何Bean,而无需指定类名或甚至使用上面的ApplicationContextLoader类?

应用程序上下文:

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

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

我正在引用Beans如下,它是null:

public class CustomerSim {

@Inject private State currentState;
.
.
.

1 个答案:

答案 0 :(得分:0)

您可以尝试使用AutowiredAnnotationBeanPostProcessor

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

我不确定您使用的方法是否应该起作用。此外,如果您开发测试,请考虑改为使用Spring Test Context framework