在我的代码库中有两个实现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的原因,两个类都被加载了。有什么方法可以
防止某个特定类不从命令行本身加载?
答案 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/