【SpringBoot】使用属性文件给成员变量配置值对静态成员变量是无效的,只对普通成员有效
【结论】
使用属性文件给成员变量配置值对静态成员变量是无效的,只对普通成员有效
【实验】
配置文件application.properties
test.a=aa; test.b=bb; test.c=cc; test.d=dd;
Test类:
package com.hy.lab.prpty; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class Test { @Value("${test.a}") public String a="a";// 普通成员,且属性文件有键值,注入有效 //@Value("${test.e}")// 普通成员,属性文件无键值,编译期报错 public String e="e"; @Value("${test.b}") public static String b="b";// 静态成员,且属性文件有键值,注入无效 @Value("${test.c}") public static final String c="c";// 静态不变成员,且属性文件有键值,注入无效 }
运行Test类:
package com.hy; import com.hy.lab.prpty.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class MyApplication implements CommandLineRunner { @Autowired Test t; public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } @Override public void run(String... args) throws Exception { System.out.println("a="+t.a); System.out.println("b="+t.b); System.out.println("c="+t.c); System.out.println("e="+t.e); } }
运行结果:
a=aa; b=b c=c e=e
从结果可以看出,只有a被注入了配置文件中的值aa,不再是java文件里的初值,另两个静态成员b和c都是java文件里的初值,而e因为配置文件中没有给它配置的值而只能屏蔽@Value,否则编译时就会报错。
越是简单越容易被忽略,再次提醒大家小心。
END