如何解决spring EL注解@Value获取值为null的问题

简介: 本文探讨了在使用Spring框架时,如何避免`@Value("${xxx.xxx}")`注解导致值为null的问题。通过具体示例分析了几种常见错误场景,包括类未交给Spring管理、字段被`static`或`final`修饰以及通过`new`而非依赖注入创建对象等,提出了相应的解决方案,并强调了理解框架原理的重要性。

你好,我是猿java。

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

问题描述

如下代码,通过@Value("${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,如果没有显示赋值,默认为空。
img.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为开发提供了很多便捷,但是稍微不注意就可能导致异常,所以对于一个新的框架,了解原理是很有必要,正所谓知其然还要知其所以然。

学习交流

如果你觉得文章有帮助,请帮忙转发给更多的好友,或关注:猿java,持续输出硬核文章。

目录
相关文章
|
1月前
|
XML Java 数据格式
SpringBoot入门(8) - 开发中还有哪些常用注解
SpringBoot入门(8) - 开发中还有哪些常用注解
52 0
|
2月前
|
Java Spring
在使用Spring的`@Value`注解注入属性值时,有一些特殊字符需要注意
【10月更文挑战第9天】在使用Spring的`@Value`注解注入属性值时,需注意一些特殊字符的正确处理方法,包括空格、引号、反斜杠、新行、制表符、逗号、大括号、$、百分号及其他特殊字符。通过适当包裹或转义,确保这些字符能被正确解析和注入。
148 3
|
27天前
|
前端开发 Java Spring
Spring MVC核心:深入理解@RequestMapping注解
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的核心,它将HTTP请求映射到控制器的处理方法上。本文将深入探讨`@RequestMapping`注解的各个方面,包括其注解的使用方法、如何与Spring MVC的其他组件协同工作,以及在实际开发中的应用案例。
40 4
|
1月前
|
XML JSON Java
SpringBoot必须掌握的常用注解!
SpringBoot必须掌握的常用注解!
65 4
SpringBoot必须掌握的常用注解!
|
27天前
|
前端开发 Java 开发者
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
95 2
|
27天前
|
前端开发 Java Spring
探索Spring MVC:@Controller注解的全面解析
在Spring MVC框架中,`@Controller`注解是构建Web应用程序的基石之一。它不仅简化了控制器的定义,还提供了一种优雅的方式来处理HTTP请求。本文将全面解析`@Controller`注解,包括其定义、用法、以及在Spring MVC中的作用。
45 2
|
1月前
|
消息中间件 Java 数据库
解密Spring Boot:深入理解条件装配与条件注解
Spring Boot中的条件装配与条件注解提供了强大的工具,使得应用程序可以根据不同的条件动态装配Bean,从而实现灵活的配置和管理。通过合理使用这些条件注解,开发者可以根据实际需求动态调整应用的行为,提升代码的可维护性和可扩展性。希望本文能够帮助你深入理解Spring Boot中的条件装配与条件注解,在实际开发中更好地应用这些功能。
36 2
|
1月前
|
JSON Java 数据格式
springboot常用注解
@RestController :修饰类,该控制器会返回Json数据 @RequestMapping(“/path”) :修饰类,该控制器的请求路径 @Autowired : 修饰属性,按照类型进行依赖注入 @PathVariable : 修饰参数,将路径值映射到参数上 @ResponseBody :修饰方法,该方法会返回Json数据 @RequestBody(需要使用Post提交方式) :修饰参数,将Json数据封装到对应参数中 @Controller@Service@Compont: 将类注册到ioc容器
|
1月前
|
XML Java 数据格式
SpringBoot入门(8) - 开发中还有哪些常用注解
SpringBoot入门(8) - 开发中还有哪些常用注解
43 2
|
27天前
|
前端开发 Java 开发者
Spring MVC中的控制器:@Controller注解全解析
在Spring MVC框架中,`@Controller`注解是构建Web应用程序控制层的核心。它不仅简化了控制器的定义,还提供了灵活的请求映射和处理机制。本文将深入探讨`@Controller`注解的用法、特点以及在实际开发中的应用。
67 0