Spring Boot - 通用原型bean自动装配

时间:2017-05-05 06:39:31

标签: java spring spring-mvc generics spring-boot

我们有一个遗留项目,其中有一个名为DataProcessor的类。因此,项目的每个模块都有自己的数据处理器,它们都扩展了一个名为BasicDataProcessor的类。例如,

public ProductDataProcessor extends BasicDataProcessor {
      public ProductDataProcessor(String logFileDirectory, String loggingLevel){
           /*constructor code*/
      }
}

public CustomerDataProcessor extends BasicDataProcessor {
      public CustomerDataProcessor(String logFileDirectory, String loggingLevel){
           /*constructor code*/
      }
}

有很多这样的Data Processor,它们都有自己的构造函数,它使用传递的属性初始化特定的数据处理器作为构造函数参数。

我们正在将此遗留应用程序转换为Spring Boot应用程序。我的目标是在各自的@Service类Spring中自动装载这个数据处理器(包括大多数业务逻辑)。因此对于例如ProductServiceProductDataProcessor自动装配。

public class ProductService {

     @Autowired
     private ProductDataProcessor productDataProcessor;

     /*-----------------------
       --Other service code---
       -----------------------*/
}

一种方法是创建@Configuration类并使用其属性初始化每个此类数据处理器。我可以在属性文件中指定数据处理器特定的属性,也可以从那里读取。

@Configuration
public class Config {

    @Bean
    @Scope(value =  ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public ProductDataProcessor productDataProcessor(String logFileDirectory, String loggingLevel){
        return new ProductDataProcessor(logFileDirectory, loggingLevel);    
    }

    /*--------------------------------------------
      --------------------------------------------
      --------------------------------------------
      ---------other Data Processor Beans---------
      --------------------------------------------
      --------------------------------------------*/
}

然后ProductServiceproductDataProcessor自动装配。

有没有其他优雅和通用的方法来实现这一目标?例如,一个通用原型bean,它将根据要求的Data Processor对象的类型创建一个新实例。

@Bean
    @Scope(value =  ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public BasicDataProcessor productDataProcessor(String logFileDirectory, String loggingLevel, String dataProcessorClassType){
        // create an object of `dataProcessorClassType` and return
    }

或者考虑每个数据处理器类的任何其他工作正在扩展BasicDataProcessor

0 个答案:

没有答案