CommandLineRunner 接口
启动成功后的回调
接口代码
package org.springframework.boot;
@FunctionalInterface
public interface CommandLineRunner {
void run(String... args) throws Exception;
}
接口定义了一个run方法,有一个参数Sting数组类型 可以启动jar包的时候
@Slf4j
@SpringBootApplication
//@EnableDiscoveryClient
public class ClientApplication implements CommandLineRunner {
public static void main(String[] args) {
log.info("开始启动");
SpringApplication.run(ClientApplication.class, args);
log.info("启动完成");
//启动服务端
NettyServer nettyServer = new NettyServer();
nettyServer.start(new InetSocketAddress("127.0.0.1", 8090));
}
@Override
public void run(String... args) throws Exception {
for(String arg : args) {
log.info("CommandLineRunner回调:"+arg);
}
}
}
启动的时候传参数 program arguments
java -jar client-0.0.1-SNAPSHOT.jar ss asa 12
program arguments 程序参数: 每个参数需要以空格隔开,否则将会被识别成一个参数
可以看到和Main方法的args参数一样的
也可以参数以键值对的方式 用的时候再解析成Map就行
public static void main(String[] args) {
Map<String, String> arguments = getArguments(args);
for (String key : arguments.keySet()) {
System.out.println(key + "=" + arguments.get(key));
}
}
public static Map<String, String> getArguments(String[] args) {
Map<String, String> arguments = new HashMap<String, String>();
if (args == null || args.length == 0) {
return arguments;
}
for (String arg : args) {
int index = arg.indexOf("=");
// 没有=,或者=是第一个,都出错。
if (index < 1) {
throw new RuntimeException("param must be key value pair");
}
String key = arg.substring(0, index);
String value = arg.substring(index + 1);
arguments.put(key, value);
}
return arguments;
}
ApplicationRunner 接口
与CommandLineRunner一样的,唯一的区别在于参数为ApplicationArguments,参数必须使用“--”开头(双横线)。可以直接通过通过 key 来获取 value
@Slf4j
@Service
public class AfterServiceStarted implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
log.info("AfterServiceStarted ApplicationRunner ");
for (String name : args.getOptionNames()) {
log.info("ApplicationRunner"+ name + "=" + args.getOptionValues(name));
}
}
}
设置 CommandLineRunner 和 ApplicationRunner 接口或者多对象设置启动先后顺序
通过注解@Order
@Order(1)
@Slf4j
@Service
public class AfterServiceStarted implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
log.info("AfterServiceStarted ApplicationRunner ");
for (String name : args.getOptionNames()) {
log.info("ApplicationRunner"+ name + "=" + args.getOptionValues(name));
}
}
}
@Order(2)
@Slf4j
@Service
public class AfterServiceStartedOther implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
log.info("AfterServiceStartedOther CommandLineRunner:");
for(String arg : args) {
log.info("CommandLineRunner"+arg);
}
}
}