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

Programmatically adding Beans to Spring application Context

我正在尝试将一个简单的字符串添加到我的 Spring 应用程序上下文中,然后将其自动装配到应用程序上下文中的另一个现有 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为null。我错过了什么?

编辑:这是我的应用程序上下文:

@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);
  }

}

谢谢

尝试使用 @Qualifier 指定要自动连接的 bean。

public class A {

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

}

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

A BeanFactoryPostProcessor may interact with and modify bean definitions, but never bean instances. Doing so may cause premature bean instantiation, violating the container and causing unintended side-effects.

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

删除行:

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

并且会起作用。