首页IT科技spring加载静态资源(spring注入静态变量有几种方法?不看的都掉坑里了!)

spring加载静态资源(spring注入静态变量有几种方法?不看的都掉坑里了!)

时间2025-05-05 02:40:29分类IT科技浏览4175
导读:springboot中经常会用到properties文件中的配置,一般使用@Value注入,但是针对Utils工具类,需要注入一个...

springboot中经常会用到properties文件中的配置           ,一般使用@Value注入                 ,但是针对Utils工具类    ,需要注入一个静态变量有几种方法?为什么有的同学注入的值为null?

代码示例

如果直接使用@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; @PostConstruct public 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; } @PostConstruct public 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; @PostConstruct public void init() { STATIC_VALUE2 = this.staticValue; System.err.println("*** staticValue=" + staticValue); System.err.println("*** STATIC_VALUE2=" + STATIC_VALUE2); } } *** staticValue=static *** STATIC_VALUE2=static

这里使用了2个知识点:

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

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

Constructor -> @Autowired/Value -> @PostConstruct

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

注意点:

staticValue不能声明为static

这种方法要多定义一个无用变量                ,所以更推荐set注入         。

?set变体

@Component public class StaticInjectionUtils { private static String staticValue; @Autowired public void setStaticValue(@Value("${static.value}") String staticValue) { System.out.println("set staticValue="+staticValue); StaticInjectionUtils.staticValue = staticValue; } @PostConstruct public void init() { System.err.println("*** staticValue=" + staticValue); } }

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

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

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

我是Pandas        ,专注Java编程实用技术分享                  ,公众号《Java实用技术手册》和B站均有视频解说       ,欢迎来玩               。

如果你觉得这篇文章有用     ,别忘了点赞+关注                  ,一起进步!

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
别把欲望当理想,莫把世故当成熟什么意思(很多人“把欲望当理想”)