spring注入静态变量有几种方法?春节假期虹猫蓝兔三千问

编程入门 行业动态 更新时间:2024-10-15 04:19:43

spring注入静态<a href=https://www.elefans.com/category/jswz/34/1771380.html style=变量有几种方法?春节假期虹猫蓝兔三千问"/>

spring注入静态变量有几种方法?春节假期虹猫蓝兔三千问

春节了,虹猫放假回家碰到了蓝兔。

虹猫: 蓝兔好久不见。我最近有个困惑,springboot中经常会用到properties文件中的配置,一般使用@Value注入,但是针对Utils工具类,需要注入一个静态变量,我用@Value为什么注入的值为null?

蓝兔: 因为@Value不支持静态变量注入,你可以尝试使用set方法上写@Value注入。当然还有其他几种方法,我一起给你讲解。

虹猫: 好啊。能给我代码示例讲解吗?

蓝兔: 搬好小板凳,听我细细说来。

代码示例

如果直接使用@Value注入是什么结果?

/*** the StaticInjectionUtils** @author Java实用技术手册* @date 2023-01-17*/
@Component
public class StaticInjectionUtils {@Value("${normal.value}")private String normalValue;@Value("${static.value}")private static String staticValue;@PostConstructpublic void init() {System.err.println("*** normalValue=" + normalValue);System.err.println("*** staticValue=" + staticValue);}
}
// 运行结果
//*** normalValue=normal  --有结果
//*** staticValue=null    --无结果
复制代码

😉set注入(推荐)

@Component
public class StaticInjectionUtils {public static String staticValue;@Value("${static.value}")public void setStaticValue(String staticValue) {StaticInjectionUtils.staticValue = staticValue;}@PostConstructpublic void init() {System.err.println("*** staticValue=" + staticValue);}
}
// *** staticValue=static
复制代码
  • 注意点1:
    默认idea的提示set方法会带上static,将导致注入失败,比如
@Value("${static.value}")
public static void setStaticValue(String staticValue) {StaticInjectionUtils.staticValue = staticValue;
}
复制代码
  • 注意点2:
    静态变量不要用this引用,要用类名.变量,虽然你用this也能工作。
@Value("${static.value}")
public void setStaticValue(String staticValue) {this.staticValue = staticValue;
}
复制代码

至于为什么用this也能生效,知道的同学可以留言讨论~

  • 注意点3:
    方法名无所谓,你可以随便改,不信你试试。

😁PostConstruct注入

@Component
public class StaticInjectionUtils {@Value("${static.value}")private String staticValue;public static String STATIC_VALUE2;@PostConstructpublic void init() {STATIC_VALUE2 = this.staticValue;System.err.println("*** staticValue=" + staticValue);System.err.println("*** STATIC_VALUE2=" + STATIC_VALUE2);}
}
*** staticValue=static
*** STATIC_VALUE2=static
复制代码

这里使用了2个知识点:

  1. 利用普通@Value变量可以注入,提前完成配置的变量保存。
  2. 利用@PostConstruct在@Value之后执行,把普通变量赋值给静态变量。

这里回忆下springbean初始化顺序:方法和注解执行先后顺序为

Constructor -> @Autowired/Value -> @PostConstruct

利用上述原理,可以做很多有用的事情,比如类初始化工作一般专门会写一个init方法。

  • 注意点:
    staticValue不能声明为static
  • 这种方法要多定义一个无用变量,所以更推荐set注入。

🤨set变体

@Component
public class StaticInjectionUtils {private static String staticValue;@Autowiredpublic void setStaticValue(@Value("${static.value}") String staticValue) {System.out.println("set staticValue="+staticValue);StaticInjectionUtils.staticValue = staticValue;}@PostConstructpublic void init() {System.err.println("*** staticValue=" + staticValue);}
}
复制代码

这也是set注入的一种变体,方法入参使用@Value注入,然后利用@Autowired,调用此方法注入给static变量。

  • 注意点:
  1. 方法不能有static修饰。
  2. 方法必须使用@Autowired注解。

以上就是本期内容,希望对你有帮助。

更多推荐

spring注入静态变量有几种方法?春节假期虹猫蓝兔三千问

本文发布于:2024-03-14 14:20:51,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1736658.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:变量   静态   几种方法   春节假期   spring

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!