前言
Spring (Boot)获取参数的方式有很多,其中最被我们熟知的为@Value了,它不可谓不强大。
今天就针对我们平时最长使用的@Value,以及可能很少人使用的@PropertySource、@ConfigurationProperties等相关注解进行一个详细的扫盲,希望能够帮助到到家,使用起来更加顺畅
@Value
@Value注解的注入非常强大,可以借助配置文件的注入、也可以直接注入
直接注入属性
- 注入普通字符串
@Value("normal") private String normal; // normal (显然这种注入的意义不大)
- 注入操作系统属性
@Value("#{systemProperties['os.name']}") private String systemPropertiesName; //效果等同于 是因为spring模版把系统变量否放进了Enviroment @Value("${os.name}") private String systemPropertiesName;
- 注入表达式结果
@Value("#{ T(java.lang.Math).random() * 100.0 }") private double randomNumber; //41.29185128620939
- 注入其它Bean的属性:Person类的name属性
@Bean public Person person() { Person person = new Person(); person.setName("fangshixiang"); return person; } //注入属性 @Value("#{person.name}") private String personName; @Test public void contextLoads() { System.out.println(personName); //fangshixiang }
- 注入文件资源
在resources下放置一个jdbc.properties配置文件。然后可以直接注入
@Value("classpath:jdbc.properties") private Resource resourceFile; // 注入文件资源 @Test public void contextLoads() throws IOException { System.out.println(resourceFile); //class path resource [jdbc.properties] String s = FileUtils.readFileToString(resourceFile.getFile(), StandardCharsets.UTF_8); System.out.println(s); //输出: //db.username=fangshixiang //db.password=fang //db.url=jdbc:mysql://localhost:3306/mytest //db.driver-class-name=com.mysql.jdbc.Driver }
- 注入Url资源
@Value("http://www.baidu.com") private Resource testUrl; // 注入URL资源 @Test public void contextLoads() { System.out.println(testUrl); //URL [http://www.baidu.com] }
@Value中$和#的区别
语法:
${ properties }和#{ SpEL }的语法区别
${ property : default_value }
#{ obj.property? : default_value } 表示SpEl表达式通常用来获取bean的属性,或者调用bean的某个方法。当然还有可以表示常量
正常使用的情况,这里不做过多的介绍了,现在介绍一些异常情况
${ properties }`:这种比较简单,如果key找不到,启动会失败。如果找不到的时候也希望正常启动,可以采用冒号+默认值的方式
#{ obj.property? : default_value }
@Value("#{person}") private Person value; @Test public void contextLoads() { System.out.println(value); //Person(name=fangshixiang, age=null, addr=null, hobby=null) }
我们发现这个很强大,可以直接把容器的里的一个对象直接注入进来。只是我们可能一般不这么做。
如果改成person1,在容器里找不到这个bean,也是会启动报错的。@Value("#{person1?:null}")这样也是不行的,因为person1找不到就会报错