springboot的configurationproperties或value注解无效
记录一个问题
在一般的springboot项目开发中,我们一般会创建一些全局的静态配置类,用来读取application.yml/application.properties配置文件的内容。
普遍的做法是利用@component和@configurationproperties(prefix = “xxx”)这两个注解来帮我们实现。
# 项目相关配置 cadre: # 名称 name: cadreuc
package com.cadre.common.config; import org.springframework.boot.context.properties.configurationproperties; import org.springframework.stereotype.component; /** * 全局配置类 * * @author cadre */ @component @configurationproperties(prefix = "cadreman") public class global { /** 项目名称 */ private static string name; public static string getname() { return name; } public static void setname(string name) { global.name = name; } }
原理非常简单,利用spring将属性注入到静态类,然后通过静态类的特性使我们可以在项目全局取到它的值。
但是,当我们照猫画虎的创建了一个静态类后,却发现我们取的值始终为null。
难道是component注解失效了吗?并不是,我们创建一个同名的bean后提示命名重复。
难道是configurationproperties注解失效了吗?带着疑问,我们继续研究。
发现问题所在
作为一名资深的cv程序员,已经多年没有手打过get/set方法了。
然而问题就在这里。当我们创建了一个静态属性时,ide帮我们生成的get/set方法都默认加上了static。
/** 项目名称 */ private static string name; public static string getname() { return name; } public static void setname(string name) { global.name = name; }
而spring在注入这些属性时,反射的set方法不会对static方法起作用。
所以导致了我们的set方法没有被调用。
解决方法
去掉set方法的static
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论