以编程方式将 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);
并且会起作用。
我正在尝试将一个简单的字符串添加到我的 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);
并且会起作用。