@Vaue注解介绍

@Value 是Spring框架中的一个注解,用于将配置属性的值注入到类的字段、方法参数或方法返回值中。它可以与各种类型的属性一起使用,包括基本类型、字符串、集合、数组等。

属性注入:通过 @Value 注解,可以将配置文件中的属性值注入到类的字段或方法参数中。这样可以方便地配置和管理应用程序中的各种属性值。

SpEL表达式支持:@Value 注解支持使用SpEL(Spring表达式语言)从配置文件中动态获取属性值。可以通过SpEL表达式进行计算、引用其他属性、调用方法等,提供了更大的灵活性和功能。

外部化配置:@Value 注解可以与 @ConfigurationProperties 注解一起使用,实现将一组相关的配置属性绑定到一个POJO类中。这样可以更方便地将配置属性从配置文件中加载,并通过注解方式进行注入和管理。

注入默认值:@Value 注解支持在属性值为空或未配置的情况下提供默认值。可以通过 @Value(“${property:defaultValue}”) 的方式指定默认值,确保属性值的存在性。

为什么@Value注解不能直接注入值给静态变量

因为 @Value 注解是在Spring容器实例化Bean时进行处理的,而静态变量属于类级别,不依赖于实例化的过程。静态变量在类加载时就已经存在,而Spring容器实例化Bean时是在类加载之后进行的。因此,无法直接通过 @Value 注解为静态变量赋值。

@Value注解注入静态属性的方法

  1. 第一种方式,把@Value(“${test.config.configName}”)放到静态变量的set方法上,还需要把当前类要交给spring来管理
private static String configName;
    
    @Value("${test.config.configName}")
    public void setTestConfigName(String configName){
        Post.configName = configName;
    }
  1. 第二种方式,使用 @postconstruct注解, 它用于标记一个方法,该方法在类实例化后、依赖注入完成后被自动调用。它的作用是在对象创建后执行一些初始化操作。
private static String configName;

    @Value("${test.config.configName}")
    private String tempName;

    @PostConstruct
    public void initField(){
        configName = tempName;
    }
  1. 第三种方式,实现InitializingBean 接口,InitializingBean 是 Spring 框架提供的一个标准接口,其中定义了一个 afterPropertiesSet() 方法,该方法在 Bean 的属性设置完成后被调用。
private static String configName;

    @Value("${test.config.configName}")
    private String tempName;

    @Override
    public void afterPropertiesSet() throws Exception {
        configName = tempName;
    }



这是大家可能会想到如果既有@postconstruct注解标记的方法,又有实现InitializingBean 接口实现类的afterPropertiesSet方法,Spring调用的先后顺序是怎样的呢,我也曾有这么一个疑问,通过阅读资料发现:

在Spring中,当一个Bean实现了InitializingBean接口并且同时使用了@PostConstruct注解标记了一个方法时,它们的调用顺序如下:
首先,Spring会调用Bean的构造函数创建Bean的实例。
接下来,Spring会通过依赖注入将Bean的属性值设置到相应的字段或属性中。
然后,Spring会先调用实现了InitializingBean接口的Bean的afterPropertiesSet()方法。
最后,Spring会调用使用了@PostConstruct注解标记的方法。

好了,使用 @value 注解注入静态属性的方法给大家介绍到这里,希望对大家有所帮助。