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

标签 java spring autowired

我正在尝试将一个简单的字符串添加到我的 Spring 应用程序上下文中,然后将其 Autowiring 到应用程序上下文中的另一个现有 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);
  }

}

谢谢

最佳答案

您不应该从 BeanFactoryPostprocessors 中实例化 beans。 来自 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 之前实例化,因此不会 Autowiring 。

删除行:

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

并且会起作用。

关于java - 以编程方式将 Bean 添加到 Spring 应用程序上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29702488/

相关文章:

java - 在水平布局中显示 ListView 时出现问题?

Spring Hibernate 事务在没有刷新的情况下不提交

java - RestTemplate 将文件作为字节从一个 Controller 发送到另一个 Controller

java - 将 JpaRepository 注入(inject) Generic 类时出现 NoUniqueBeanDefinitionException

java - 启用 JSP 自定义 taglib 以使用 spring 服务 bean

android - 在 Android SDK 中设置 JAVA_HOME

java - Apache Ant 正在创建奇怪的目录

java - HTTP 错误 503 : can not access/. 原因 服务不可用

java - @Autowired 字段导致 org.springframework.beans.factory.BeanCreationException

java - ExoPlayer onResume() 恢复播放状态