专栏首页javathings使用@Value 和@PropertySource 实现为属性赋值

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

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

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

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

分别举例说明:

基于数值

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

@Value(“ 张三”)

private String userName;

基于 SpEL

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

如:

@Value("#{30-2}")
private Integer age;

基于配置文件

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

@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 这个路径下:

u.name=zhangsan
u.age=29 

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

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();
    }
}

输出如下:

zhangsan
zhangsan

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

比如:

@Value("${user.name}")
private String userName;

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

Administrator

静态变量注入值

@Component
@PropertySource(value = { "classpath:/mine.properties" })
public class User {
 
	@Value("${u.staticString}")
	public static String staticString;
}

配置文件中

u.staticString=this is a staticString

Main 方法

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

输出:

null

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

@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;
	}
}

输出:

inject staticString....
this is a staticString

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring 中如何控制对象的初始化时间(延迟加载,强制先行加载)

    当标注了@Lazy 注解时候,不会看到 init user… 的输出。只有当首次使用 User 类的时候,才会被初始化。

    水货程序员
  • 为什么 spring 中,不支持 autowired 静态变量?

    因为静态变量是属于本身类的信息,当类加载器加载静态变量时,Spring 的上下文环境还没有被加载,所以不可能为静态变量绑定值。

    水货程序员
  • synchronized 关键字的用法?

    如果面试问到这个题目,那么就可以窃喜了,因为太简单了,只要写过多线程代码的人,肯定用到过 synchronized 关键字。我把答案总结在这里,背诵一下就可以了...

    水货程序员
  • springboot集成redis实现消息发布订阅模式-跨多服务器

    基础配置参考 https://blog.csdn.net/llll234/article/details/80966952

    用户1518699
  • SpringBoot分组校验及自定义校验注解

    在日常的开发中,参数校验是非常重要的一个环节,严格参数校验会减少很多出bug的概率,增加接口的安全性。在此之前写过一篇SpringBoot统一参数校验主要介绍了...

    不一样的科技宅
  • 建造者模式(Builder)及其应用

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/...

    用户2965908
  • [享学Eureka] 五、Eureka核心概念:应用(Application)和注册表(Applications)

    代码下载地址:https://github.com/f641385712/netflix-learning

    YourBatman
  • java.lang.ClassCastException: java.lang.String cannot be cast to com.qbz.entity.TblUser

    qubianzhong
  • HAWQ取代传统数仓实践(六)——增加列

            业务的扩展或变化是不可避免的,尤其像互联网行业,需求变更已经成为常态,唯一不变的就是变化本身,其中最常碰到的扩展是给一个已经存在的表曾加列。  ...

    用户1148526
  • 架构组件:基于shard-jdbc中间件,实现数据分库分表

    一、水平分割 1、水平分库 1)、概念: 以字段为依据,按照一定策略,将一个库中的数据拆分到多个库中。 2)、结果 每个库的结构都一样;数据都不一样; 所有库的...

    知了一笑

扫码关注云+社区

领取腾讯云代金券