我的情况是 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
。我如何获得那里的属性(property)?
最佳答案
为什么不简单地使用 @Value
中的 Class.forName()
在 ApplicationContext
中定义一个新的 Bean
code> 注入(inject)到 @Configuration
中?
所以像这样:
@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;
}
关于Spring Java配置: Create Bean From Dynamic Class Name,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23633802/