@Value注解的作用
- 为什么使用@Value
使用@Vlue可以实现对于线上项目的一些通用配置的修改;或者修改项目中可能出现变动,但是却又有很多地方都在使用的一些参数,这样我们我可直接通过修改配置文件而不用修改代码的方式来达到参数的修改的目的。 - 读取配置文件中的属性
@Value的值有以下两类:
${ property : default_value }
#{ obj.property? : default_value }
$注入的是配置文件中的property ":" 对未配置或值为空的属性设置默认值
#注入SpEl表达式内容,使用"?:" 对未配置或值为空的表达式设置默认值
静态与非静态的注入(final与静态同理)
final 与 static
- final
Java 允许生成空白 final,也就是说被声明为 final 但又没有给出定值的字段,但是必须在该字段被使用之前被赋值,这给予我们两种选择:
- 在定义处进行赋值(这不叫空白final)
- 在构造器中进行赋值,保证了该值在被使用前赋值。
person:
name: kk
1.非静态字段读取
@Value(${person.name})
private String name;
2.静态字段读取
- 通过方法 方法名可以随意
private static String name;
@Value(${person.name})
public void initName(String s){
name = s;
}
- 通过@PostConstruct简介注入
private static String name;
@Value(${person.name})
private String s;
@PostConstruct
public void init(){
name = s;
}
Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注释的方法)
- 继承InitializingBean接口覆写aftePropertiesSet方法
public class Person implements InitializingBean {
private static String name;
@Value(${person.name})
private String s;
@Override
public void afterPropertiesSet() throw Exception {
name = s;
}
}
给不同类型变量注入
test:
array1: aaa,bbb,ccc
array2: 111,222,333
array3: 11.1,22.2,33.3
list1: ddd,eeee,111,333,222,444
map1: '{"name": "zhangsan", "sex": "male"}'
map2: '{"math": "90", "english": "85"}'
1.list与array
@Value("${test.array1:}")
private String[] array1;
@Value("#{'${test.array2}'.split(',')}")
private List<String> list1;
@Value("#{'${test.list:}'.empty ? null : '${test.list:}'.split(',')}")
private List<String> testList;
2.Map
@Value("#{${test.map2}}")
private Map<String,String> map1;
@Value("#{${test.map2}}")
private Map<String,Integer> map2;
注入文件或url资源
- 注入文件资源
@Value("classpath:com/hry/spring/configinject/config.txt")
private Resource resourceFile;
- 注入url资源
@Value("http://www.baidu.com")
private Resource testUrl;
使用场景
1.不能直接作用于静态变量(static);
2.不能直接作用于常量(final);
3.不能在非注册的类中使用(类需要被注册在spring上下文中,如用@Service,@RestController,@Component等);
4.使用这个类时,只能通过依赖注入的方式,用new的方式是不会自动注入这些配置的。