Spring Java配置: Create Bean From Dynamic Class Name

标签 spring configuration dependency-injection

我的情况是 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,并且serviceClassNamenull。我如何获得那里的属性(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/

相关文章:

java - Modelmapper 无法映射整个模型?

spring - Spring Boot Post 方法中 Size 较大时接收字段为空

spring - 了解基本的Spring框架和总流程

asp.net - web.config 和 app.config 中不同 Entity Framework 连接字符串的问题

linux - 安装 perl 以便可以通过多个路径访问它

php - 如何识别 PHP 是作为模块安装还是作为 CGI 安装

c# - Autofac 和 IHttpClientFactory : Cannot resolve parameter 'System.Net.Http.HttpClient httpClient'

spring - @RequestBody 正在获取空值

android - Dagger 不能创建对象图,尽管它可以生成点文件

c# - FreshMvvm 中的控制反转 (IOC)