gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 20:33:45 26 4
gpt4 key购买 nike

我正在尝试将一个简单的字符串添加到我的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com