use*_*468 5 java spring autowired
我试图在我的Spring应用程序上下文中添加一个简单的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;
}
Run Code Online (Sandbox Code Playgroud)
运行此操作时,messageA实例的属性为null.我错过了什么?
编辑:这是我的应用程序上下文:
@Configuration
class TestConfig {
@Bean
public A a() {
return new A();
}
@Bean
public MyPostProcessor postProcessor() {
return new MyPostProcessor();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的考验:
@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);
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢
您不应该从 实例化 bean BeanFactoryPostprocessors。来自BeanFactoryPostProcessorJavaDoc:
BeanFactoryPostProcessor 可以与 bean 定义交互并修改 bean 定义,但永远不能与 bean 实例交互。这样做可能会导致 bean 过早实例化,从而破坏容器并导致意外的副作用。
在您的情况下,Abean 是在之前实例化的BeanPostProcessors,因此不会自动装配。
删除行:
A a = beanFactory.getBean(A.class);
beanFactory.autowireBean(a);
Run Code Online (Sandbox Code Playgroud)
并且会起作用。
| 归档时间: |
|
| 查看次数: |
7801 次 |
| 最近记录: |