以编程方式将Bean添加到Spring应用程序上下文

时间:2015-04-17 14:48:27

标签: java spring autowired

我正在尝试向我的Spring Application Context添加一个简单的String,然后将其自动装配到应用程序上下文中的另一个现有bean(A)。我知道这不是通常的方法,但我需要以编程方式添加许多bean,否则会使我的xml配置变得庞大。

public class MyPostProcessor implements BeanFactoryPostProcessor, Ordered {

  @Override
  public int getOrder() {
    return 0;
  }

  @Override
  public void postProcessBeanFactory(
        ConfigurableListableBeanFactory beanFactory) throws BeansException {
    beanFactory.registerSingleton("myString", "this is the String");
    A a = beanFactory.getBean(A.class);
    beanFactory.autowireBean(a);
  }
}    

public class A {

    @Autowired 
    public transient String message;

}

运行此操作时,A实例的属性message为空。我错过了什么?

编辑:这是我的申请背景:

@Configuration
class TestConfig {

  @Bean 
  public A a() {
    return new A();
  }

  @Bean
  public MyPostProcessor postProcessor() {
    return new MyPostProcessor();
  }

}

这是我的考验:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfig.class)
public class MyTest {

  @Autowired 
  private transient A a;

  @Test
  public void test() throws Exception {
    System.err.println("Running");
    System.err.println("This is the autowired String: " + a.message);
    Thread.sleep(1000);
  }

}

由于

2 个答案:

答案 0 :(得分:1)

您不应该从BeanFactoryPostprocessors实例化bean。 来自BeanFactoryPostProcessor JavaDoc:

  

BeanFactoryPostProcessor可以与bean交互并修改bean   定义,但绝不是bean实例。这样做可能会导致早产   bean实例化,违反容器并导致意外   副作用。

在您的情况下,A bean在BeanPostProcessors之前被实例化,因此不会自动装配。

删除行:

A a = beanFactory.getBean(A.class);
beanFactory.autowireBean(a);

并且会奏效。

答案 1 :(得分:0)

尝试使用@Qualifier来确定您想要自动连接哪个bean。

public class A {

    @Autowired 
    @Qualifier("myString")
    public transient String message;

}