首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >使用@Value 和@PropertySource 实现为属性赋值

使用@Value 和@PropertySource 实现为属性赋值

作者头像
水货程序员
修改2018-12-03 15:19:27
修改2018-12-03 15:19:27
3K0
举报
文章被收录于专栏:javathingsjavathings

使用@Value 和@PropertySource 实现为属性赋值

@Value 注解可以为属性值赋值,赋值的方式有多种。

  • 基于数值。
  • 基于 SpEL 表达式#{}。
  • 基于配置文件的。(配置文件中的值都会进入运行的环境变量中的值)

分别举例说明:

基于数值

基于数值的话,最简单。只需要把值写入@Value 注解即可:

@Value(“ 张三”)

private String userName;

基于 SpEL

基于 SpEL 表达式也很简单,只需要写 SpEL 表达式,可以参考 Spring Expression Language(SpEL)速查指南

如:

代码语言:javascript
复制
@Value("#{30-2}")
private Integer age;

基于配置文件

第一步先指定配置文件,通过 PropertySource 注解指定路径。所谓的配置文件,就是存放键值对的 properties 文件。

代码语言:javascript
复制
@Component
@PropertySource(value =  {
    "classpath:/mine.properties"}
)
public class User {
    @Value("${u.name}")
    private String userName;
 
    public String getUserName() {
        return userName;
    }
 
    public void setUserName(String userName) {
        this.userName = userName;
    }
}

配置文件放在/src/main/resources/mine.properties 这个路径下:

代码语言:javascript
复制
u.name=zhangsan
u.age=29 

注意:所谓的配置参数的值,都是在环境变量中,可以从环境变量中读取到该值。

代码语言:javascript
复制
public class Main {
    public static void main(String[] args) {
        // 使用Config.class这个配置类
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config.class);
        User user = (User) applicationContext.getBean("user");
        System.out.println(user.getUserName());
 
        ConfigurableEnvironment environment = applicationContext.getEnvironment();
        System.out.println(environment.getProperty("u.name")); //读取环境变量的值
        applicationContext.close();
    }
}

输出如下:

代码语言:javascript
复制
zhangsan
zhangsan

因此,除了注入 property 文件中设置的值,还可以注入环境变量中的值。

比如:

代码语言:javascript
复制
@Value("${user.name}")
private String userName;

这个${user.name} 注入的是环境变量中的值

代码语言:javascript
复制
Administrator

静态变量注入值

代码语言:javascript
复制
@Component
@PropertySource(value = { "classpath:/mine.properties" })
public class User {
 
	@Value("${u.staticString}")
	public static String staticString;
}

配置文件中

代码语言:javascript
复制
u.staticString=this is a staticString

Main 方法

代码语言:javascript
复制
public class Main {
    public static void main(String[] args) {
        // 使用Config.class这个配置类
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config.class);
        System.out.println(User.staticString);
        applicationContext.close();
    }
}

输出:

代码语言:javascript
复制
null

原因在于,Spring 不允许将值直接注入给静态变量 ,只能使用变通的方法:

代码语言:javascript
复制
@Component
@PropertySource(value = { "classpath:/mine.properties" })
public class User {
	public static String staticString;
	@Value("${u.staticString}")
	public void setStaticString(String staticString) {
		System.out.println("inject staticString....");
		User.staticString = staticString;
	}
}

输出:

代码语言:javascript
复制
inject staticString....
this is a staticString
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用@Value 和@PropertySource 实现为属性赋值
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档