多个实现相同的类时,如何仅加载实现应用程序运行程序的特定类?

时间:2019-05-13 11:55:21

标签: spring-boot

在我的代码库中有两个实现org.springframework.boot.ApplicationRunner的类。当我的应用程序被加载时,两个实现ApplicationRunner的类都被加载了。是否有任何命令行参数,我们只能用它们来控制实现ApplicationRunner的特定类即使两个类在类级别都具有@Component批注也会被加载?

目前,我正在像

这样的命令行中传递参数

“ $ SPRINGBOOTAPP_JAVA” -Xmx4096m -jar $ BASEDIR / item_substitution-1.0.jar --spring.config.additional-location = $ {CONFIG_FILE},$ {CONNECTION_FILE} --applicationRunner =“ ItemOutOfStockSubstitutionJob”

在班上

@Component 公共类ItemOutOfStockSubstitutionJob实现了ApplicationRunner {

私有静态最终Logger日志= LoggerFactory.getLogger(ItemSubstitutionConstants.PROCESS_LOG);

私有最终字符串className = getClass()。getSimpleName();

@Override

public void run(ApplicationArguments args)引发异常{

logInfo(log,className +“ ____________________商品缺货

SubstitutionJob流程开始执行__________________________“);

if( !args.getOptionNames().isEmpty() 

        && 

args.getOptionNames()。contains(ItemSubstitutionConstants.APPLICATION_RUNNER

        && 

args.getOptionValues(ItemSubstitutionConstants.APPLICATION_RUNNER).get(0).e

qualsIgnoreCase(ItemSubstitutionConstants.ITEM_OUT_OF_STOCK_SUBSTITUTION_JO

B)){

    logInfo(log, className + "_____________________: 

APPLICATION_RUNNER == ITEM_OUT_OF_STOCK_SUBSTITUTION_JOB

:___________________“);

}

logInfo(log, className + "_____________________: APPLICATION_RUNNER 

!= ITEM_OUT_OF_STOCK_SUBSTITUTION_JOB:___________________“);

}

}

但是由于@Component的原因,两个类都被加载了。有什么方法可以

防止某个特定类不从命令行本身加载?

1 个答案:

答案 0 :(得分:0)

在运行时切换实现的一种方法是提供一种创建bean的工厂方法。要使用它,请不要用@Component@Service注释服务类,并在您的@Configuration类上,提供如下方法:

@Bean
public ApplicationRunner getApplicationRunner() {
    // read the env var
    // select the desired implementation to be used         
}

此博客文章提供了有关此技术的一个很好的示例:https://www.intertech.com/Blog/spring-4-conditional-bean-configuration/