Spring @Value 使用应该注意的点

很多时候,我们会使用到Spring的EL表达式,通过@Value(“${http://xxx.xxx}”)注解方式从属性文件中获取配置信息,但是,稍不注意,获取的值就为null, 今天我们就来聊聊Spring @Value 使用应该注意的点。

问题描述

如下代码,通过@Value(“${http://xxx.xxx}”)从 application.properties文件中获取 application.name 属性的值

# application.properties application.name = yuan

public class PropertyBean { 
    @Value("${application.name}") 
    private String applicationName; 
 
    public static void main(String[] args) {
     System.out.println("applicationName=" + applicationName); 
   } 
}
我们先看下运行结果:

applicationName=
很奇怪,为什么没有获取到application.name的值呢?

错误使用场景

错误使用场景一

类未交给spring管理,如下代码:

public class PropertyBean { 
   @Value("${application.name}") 
   private String applicationName; 
}
@Value(“${}”)是Spring的EL表达式,属于spring的一种注入方式, 所以要想sprig把application.name的值注入给PropertyBean类的applicationName字段,就必须把PropertyBean类交给Spring管理,这样spring才知道哪里需要它自动注入。 因此解决办法可以在PropertyBean类上增加@Component注解:

@Component 
public class PropertyBean { 
    @Value("${application.name}") 
    private String applicationName; 
}
错误使用场景二

类的字段被static或者final修饰,如下代码:

@Component 
public class PropertyBean { 
     @Value("${application.name}") 
     private static String applicationName; 
}
PropertyBean类的applicationName字段被static修饰,导致获取为null,这是因为静态变量是类的属性,并不属于对象的属性,而Spring是基于对象的属性进行依赖注入的。所以用@Value注解注入静态变量是失败的。 解决办法是把字段applicationName前面的static或者final去掉。

错误使用场景三

使用PropertyBean的地方是new出来而不是通过依赖注入的,获取值为null。如下代码:

@Component
public class PropertyBean {
    @Value("${application.name}")
    private String applicationName;

    // 此处 applicationName有值
    public static void main(String[] args) {
        System.out.println("applicationName=" + applicationName);
    }
}

@Service
public class SpringElService {
    public String getApplicationName(){
        // 通过new PropertyBean()获取对象
        PropertyBean bean = new PropertyBean();
        // 此处 applicationName为null
        return bean.getApplicationName();
    }
}
这种场景最容易被忽视,PropertyBean类中applicationName有值,SpringElService类中却为null,为什么?

为了帮助理解,我画了一个简单的抽象图,场景三里面,PropertyBean出现了两种类型bean,一种是Spring容器中管理的PropertyBean bean,applicationName的值spring可以自动注入, 一种是手动创建的PropertyBean bean,String类型的applicationName,如果没有显示赋值,默认为空。

e13601ee9ab342978b0d57381f7d218c.png
正确使用方式如下代码: 

# aplication.properties 
application.name = yuan

@Component 
public class PropertyBean { 
      @Value("${application.name}") 
      private String applicationName; 

@Service 
public class SpringElService { 
      private final PropertyBean bean; 
      // 构造器注入 bean 
      public SpringElService(PropertyBean bean){ 
          this.bean = bean; 
      } 

     public String getApplicationName(){ 
           return bean.getApplicationName(); 
     }
 }
总结

本文通过几个常见的错误场景分析了@Value获取值为空的原因
spring为开发提供了很多便捷,但是稍微不注意就可能导致异常,所以对于一个新的框架,了解原理是很有必要,正所谓知其然还要知其所以然。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蜀州凯哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值