我的情况是bean的类名可以由外部属性文件配置。用XML
做这件事情很好 <bean id="myService" class="${app.serviceClass}" />
和properties-file
app.serviceClass=com.example.GreatestClassThereIs
我尝试使用BeanFactoryPostProcessor
:
@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
。我如何在那里获得房产?
答案 0 :(得分:4)
为什么不使用注入Bean
的{{1}}中的ApplicationContext
在Class.forName()
中定义新的@Value
?
这样的事情:
@Configuration
由sjngm编辑(为了比评论更好的可读性):
@Configuration
public class MyConfiguration
{
@Value("${app.serviceClass}")
private String serviceClassName;
@Bean
public Object myService()
{
return Class.forName(serviceClassName).newInstance();
}
}