29人参与 • 2025-08-23 • Java
在代码开发中,经常会存在调用第三方工具或者其他系统的场景,通常封装成一个工具类供service进行调用,便于后期的维护及代码复用。
工具类中的属性及方法都被static修饰,在工具类中不能使用和service中一样的注入bean及引用nacos值的方式。
不能给静态变量注入bean的原因
spring从源码层面不提供对static修饰的变量进行注入,静态变量不属于任何一个实例,而是属于类的。
当类加载器加载静态变量时,spring的上下文环境还没有被加载。
这是因为初始化类的加载升序导致的,程序启动时会加载根路径下所有的类,不管这个类是否会用到都会去加载;会先初始化静态变量和执行静态代码块,这时候无法创建对象,而@autowired是要注入一个对象。
@component public class bpmutils { private static resttemplate resttemplate; private static logtool logtool; @autowired public void setresttemplate(resttemplate resttemplate) { bpmutils.resttemplate = resttemplate; } @autowired public void setlogtool(logtool logtool) { bpmutils.logtool = logtool; } // 权限用户名 private static string accesskey; // 权限密码 private static string secret; // 系统用户 private static string usercode; // tokenurl private static string tokenurl; // 部门url private static string depturl; // 用户url private static string userurl; @nacosvalue(value = "${bpm.accesskey}", autorefreshed = true) public void setaccesskey(string accesskey) { bpmutils.accesskey = accesskey; } @nacosvalue(value = "${bpm.secret}", autorefreshed = true) public void setsecret(string secret) { bpmutils.secret = secret; } @nacosvalue(value = "${bpm.usercode}", autorefreshed = true) public void setusercode(string usercode) { bpmutils.usercode = usercode; } @nacosvalue(value = "${bpm.tokenurl}", autorefreshed = true) public void settokenurl(string tokenurl) { bpmutils.tokenurl = tokenurl; } @nacosvalue(value = "${bpm.depturl}", autorefreshed = true) public void setdepturl(string depturl) { bpmutils.depturl = depturl; } @nacosvalue(value = "${bpm.userurl}", autorefreshed = true) public void setuserurl(string userurl) { bpmutils.userurl = userurl; } }
可以通过构造器进行注入,或者通过setter方法进行注入。注意要在类上添加@component注解,标记为一个bean,这样spring容器会扫描到。
我上面采用的是setter方法注入,将容器中已有的bean设置到静态变量中。
也可以使用构造器注入的方式
@autowired public testclass(autowiredtypecomponent component) { testclass.component = component; }
通过setter方法进行注入,在setter方法上添加nacos注解,获取配置的值,将值设置到静态变量中。
在实际开发中,我们也可以不使用静态工具类的方式,可以通过注解方式创建一个bean,在bean内直接注入nacos中的属性,并写一些方法,实际使用时,可以直接注入bean,然后进行使用。
使用静态工具类的方式,无需注入,可以直接使用。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论