启动类:
@SpringBootApplication
public class M2Application {
public static void main(String[] args) {
System.setProperty("a.x","xx_xx"); // 如果放到run下面不会生效并且在后续System.getProperty("a.x")也是null
// 如果-D 或者 环境变量中也设置了,生效的还是这里
SpringApplication.run(M2Application.class, args);
}
}
监听启动的类中:
@Component
@RequiredArgsConstructor
public class InitEventListener {
@Autowired
private Environment environment;
@Autowired
private CongfigInfo congfigInfo;
@EventListener
public void onApplicationReady(ApplicationReadyEvent event){
//-Da.b=tt a.z=ztt enviroment:env=env_env;a.c=env_cc;a.z=env_tt yml:a.b=bb a.c=cc z=zz a.x=xx
// 只能获取-D设置参数,获取不到yml的值
System.out.println(System.getProperty("a.b"));
System.out.println(System.getProperty("env"));
System.out.println(System.getProperty("a.c")); // tt null null
System.out.println();
System.out.println();
// 只能获取环境变量
System.out.println(System.getenv().get("a.b"));
System.out.println(System.getenv().get("env"));
System.out.println(System.getenv().get("a.c")); //null env_env env_cc
System.out.println();
System.out.println();
// 所有的都可以获取
System.out.println(environment.getProperty("a.b"));
System.out.println(environment.getProperty("env"));
System.out.println(environment.getProperty("a.c")); // tt env_env env_cc
System.out.println();
System.out.println();
// -D会影响yml的值 环境变量会影响yml的值 如果两个同事设置了同一个元素,生效的是-D
//(可能是-D晚了一步设置覆盖了环境设置的)
System.out.println(congfigInfo.getB());
System.out.println(congfigInfo.getC());
System.out.println(congfigInfo.getZ());
System.out.println(congfigInfo.getX()); // tt env_cc ztt xx_xx
System.out.println();
System.out.println();
System.setProperty("a.b","xx_bb");
System.out.println(congfigInfo.getB()); // tt 这里上面没有生效是因为spring已
//经启动了,已经赋完值了,并且代码中动态获取@Value("${a.b}") 获取的也是tt,
//如果是在启动类中设置就会生效
System.out.println(System.getProperty("a.b")); // xx_bb
}
}