@Value用法详解,如何给static变量注入

@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的方式是不会自动注入这些配置的。

  • 12
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值