我试图将一个简单的字符串添加到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为空。我遗漏了什么?
编辑:这是我的应用程序上下文:
@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);
}
}谢谢
发布于 2015-04-17 19:59:13
您不应该从BeanFactoryPostprocessors实例化bean。来自BeanFactoryPostProcessor JavaDoc:
BeanFactoryPostProcessor可以与bean定义交互和修改bean定义,但绝不会修改bean实例。这样做可能会导致过早的bean实例化,破坏容器,并导致意外的副作用。
在您的示例中,A bean是在BeanPostProcessors之前实例化的,因此不是自动生成的。
移除线条:
A a = beanFactory.getBean(A.class);
beanFactory.autowireBean(a);而且会起作用。
发布于 2015-04-17 14:54:53
尝试使用@Qualifier来指定您想要自动连接的bean。
public class A {
@Autowired
@Qualifier("myString")
public transient String message;
}https://stackoverflow.com/questions/29702488
复制相似问题