我用以下命令运行我的spring boot应用程序
mvn spring-boot:run -Dspring-boot.run.arguments="test1,test2,test3“
我需要在我的runnable中使用这3个参数。我如何在我的Compressor runnable类中访问它们?它会打印null。
@Configuration
public class MultiThreadConfig {
@Bean
public TaskExecutor taskExecutor() {
return new SimpleAsyncTaskExecutor(); // Or use another one of your liking
}
@Bean
public CommandLineRunner schedulingRunner(TaskExecutor executor) {
return new CommandLineRunner() {
public void run(String[] args) throws Exception {
executor.execute(new Compressor(args));
}
};
}
}
public class Compressor implements Runnable {
@Autowired
ApplicationArguments appArgs;
String[] args;
// Constructor
public Compressor(String[] args) {
//Initialization of atributes
}
@Override
public void run() {
System.out.println("COMPRESSOR YO");
System.out.println(Arrays.toString(args));
System.out.println(appArgs);
}
}发布于 2020-01-18 16:39:52
正如Jesper指出的,您是使用new关键字自己创建Compressor对象的,所以ApplicationArguments不会被自动连接,因为Compressor的这个实例不是由Spring管理的。解决方案是为Compressor对象创建一个bean,并让Spring对其进行管理。例如:
@Configuration
public class MultiThreadConfig {
@Bean
public TaskExecutor taskExecutor() {
return new SimpleAsyncTaskExecutor(); // Or use another one of your liking
}
@Bean
public Compressor compressor(ApplicationArguments applicationArguments) {
return Compressor(applicationArguments);
}
@Bean
public CommandLineRunner schedulingRunner(TaskExecutor executor, Compressor compressor) {
return new CommandLineRunner() {
public void run(String[] args) throws Exception {
executor.execute(compressor);
}
};
}
}和
public class Compressor implements Runnable {
private final ApplicationArguments appArgs;
private final String[] args;
@Autowired
public Compressor(ApplicationArguments applicationArguments) {
appArgs = applicationArguments;
args = applicationArguments.getSourceArgs();
}
@Override
public void run() {
System.out.println("COMPRESSOR YO");
System.out.println(Arrays.toString(args));
}
}请注意,这里我使用的是构造函数注入,而不是字段注入,后者通常是更好的选择。
如果你不想在配置中创建一个bean,你也可以用Spring原型标记Compressor:
@Component
public class Compressor implements Runnable {
private final ApplicationArguments appArgs;
private final String[] args;
public Compressor(ApplicationArguments applicationArguments) {
appArgs = applicationArguments;
args = applicationArguments.getSourceArgs();
}
//...
}并在您的配置中使用它的实例,如下所示:
@Bean
public CommandLineRunner schedulingRunner(TaskExecutor executor, Compressor compressor) {
//...
}https://stackoverflow.com/questions/59798643
复制相似问题