我的情况是,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。我怎么才能把房子弄进去?
发布于 2014-05-13 14:32:00
为什么不简单地在您的ApplicationContext中定义一个新的ApplicationContext,使用注入到@Configuration中的@Value中的Class.forName()
所以就像这样:
@Configuration
public class MyConfiguration
{
@Value("${app.serviceClass}")
private String serviceClassName;
@Bean
public Object myService()
{
return Class.forName(serviceClassName).newInstance();
}
}由sjngm编辑(为了获得比注释更好的可读性):
@Bean
public MyInterface myService()
{
Class<?> serviceClass = Class.forName(serviceClassName);
MyInterface service = MyInterface.class.cast(serviceClass.newInstance());
return service;
}https://stackoverflow.com/questions/23633802
复制相似问题