根据命令行参数注入实现

Out*_*ind 1 java command-line interface autowired spring-boot

有没有办法在Spring Boot中基于​​命令行参数注入特定的接口实现?

我有一个数据加载应用程序,并根据命令行参数我需要加载特定类型的数据.

这是我的主要课程CommandLineRunner:

@SpringBootApplication
public class DataLoadersApplication implements CommandLineRunner {

    private Type1LoadProcess type1LoadProcess;
    private Type2LoadProcess type2LoadProcess;

    public DataLoadersApplication(Type1LoadProcess type1LoadProcess,
      Type2LoadProcess type2LoadProcess) {
        this.type1LoadProcess = type1LoadProcess;
        this.type2LoadProcess = type2LoadProcess;
    }

    public static void main(String[] args) {
        SpringApplication.run(DataLoadersApplication.class, args);
    }

    @Override
    public void run(String... args) {
        if (args[0].equalsIgnoreCase("load-type1")) {
            type1LoadProcess.process();
        } else if (args[0].equalsIgnoreCase("load-type2")) {
            type2LoadProcess.process();
        } 
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法DataLoadeProcess用两个实现创建一个接口,Type1DataLoadProcessType2DataLoadProcess根据命令行arg在main类中注入实现?

Sim*_*lli 5

您可以使用Spring配置文件来实现您的目标:https: //docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html

创建接口DataLoadProcess

然后是班级:

@Component
@Profile("type1")
public class Type1LoadProcess implements DataLoadProcess {
}

@Component
@Profile("type2")
public class Type2LoadProcess implements DataLoadProcess {
}
Run Code Online (Sandbox Code Playgroud)

然后你可以注入接口类型,如:

@Autowired 
DataLoadProcess dataLoadProcessor;
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用其中一个配置文件启动应用程序,例如使用系统属性集:

-Dspring.profiles.active=type1
Run Code Online (Sandbox Code Playgroud)