【发布时间】:2014-05-13 14:17:28
【问题描述】:
我的情况是 bean 的类名可以由外部属性文件配置。用 XML 就可以了
<bean id="myService" class="${app.serviceClass}" />
和属性文件
app.serviceClass=com.example.GreatestClassThereIs
我尝试使用 BeanFactoryPostProcessor 将其转换为 Java:
@Configuration
public class MyConfiguration implements BeanFactoryPostProcessor {
@Value("${app.serviceClass}")
private String serviceClassName;
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
logger.warn("let's register bean of class " + serviceClassName + "...");
GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClassName(serviceClassName);
BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
registry.registerBeanDefinition("myService", beanDefinition);
logger.warn("done " + beanDefinition);
}
}
问题是Spring的生命周期还没有设置处理@Value和serviceClassName是null。我如何获得那里的财产?
【问题讨论】:
-
不确定您要达到的目标。你有一个
@Configuration类,它实际上是一个BeanFactoryPostProcessor。对我来说似乎很奇怪。定义@Bean并使用 SpringClassUtils创建该 bean 的实例。否则,使用${app.serviceClass}注册RootBeanDefinition也可能有效。 -
@M.Deinum 好吧,我的问题中的来源只是这个问题的重要内容。我不想写可能会引起更多混乱的离题。我会检查你的两个建议。两者都会导致 Spring 在 bean 上执行 DI 等操作吗?
-
一个 bean 无论如何构造都是一个 bean。
-
@SotiriosDelimanolis 我完全不明白所谓的重复问题是关于什么的。我可以看到一个答案建议使用
BeanDefinitionRegistryPostProcessor,我还没有听说过,但其余的太混乱了,我什至无法争论我的问题是否重复;) -
没关系,我离题了。抱歉,已重新打开。
标签: spring configuration dependency-injection