@Value注解的作用
  1. 为什么使用@Value
    使用@Vlue可以实现对于线上项目的一些通用配置的修改;或者修改项目中可能出现变动,但是却又有很多地方都在使用的一些参数,这样我们我可直接通过修改配置文件而不用修改代码的方式来达到参数的修改的目的。
  2. 读取配置文件中的属性
    @Value的值有以下两类:
${ property : default_value }
#{ obj.property? : default_value }
$注入的是配置文件中的property ":" 对未配置或值为空的属性设置默认值
#注入SpEl表达式内容,使用"?:" 对未配置或值为空的表达式设置默认值
静态与非静态的注入(final与静态同理)
final 与 static
  1. final
    Java 允许生成空白 final,也就是说被声明为 final 但又没有给出定值的字段,但是必须在该字段被使用之前被赋值,这给予我们两种选择:
  • 在定义处进行赋值(这不叫空白final)
  • 在构造器中进行赋值,保证了该值在被使用前赋值。
person:
     name: kk
1.非静态字段读取
//非静态字段读取
@Value(${person.name})
private String name;

2.静态字段读取
  1. 通过方法 方法名可以随意
private static String name;

@Value(${person.name})
public void initName(String s){
	name = s;
}
  1. 通过@PostConstruct简介注入
private static String name;

@Value(${person.name})
private String s;

@PostConstruct
public void init(){
	name = s;
}

//Java中该注解的说明:@PostConstruct该注解被用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。
Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注释的方法)

  1. 继承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;
	}

}

//InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候会执行该方法。
给不同类型变量注入
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资源
  1. 注入文件资源
@Value("classpath:com/hry/spring/configinject/config.txt")
private Resource resourceFile; // 注入文件资源
  1. 注入url资源
@Value("http://www.baidu.com")
private Resource testUrl; // 注入URL资源
使用场景
1.不能直接作用于静态变量(static);

2.不能直接作用于常量(final;

3.不能在非注册的类中使用(类需要被注册在spring上下文中,如用@Service,@RestController,@Component等);

4.使用这个类时,只能通过依赖注入的方式,用new的方式是不会自动注入这些配置的。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐