1.说明
在代码开发中,经常会存在调用第三方工具或者其他系统的场景,通常封装成一个工具类供service进行调用,便于后期的维护及代码复用。
工具类中的属性及方法都被static修饰,在工具类中不能使用和service中一样的注入bean及引用nacos值的方式。
不能给静态变量注入bean的原因
spring从源码层面不提供对static修饰的变量进行注入,静态变量不属于任何一个实例,而是属于类的。
当类加载器加载静态变量时,spring的上下文环境还没有被加载。
这是因为初始化类的加载升序导致的,程序启动时会加载根路径下所有的类,不管这个类是否会用到都会去加载;会先初始化静态变量和执行静态代码块,这时候无法创建对象,而@autowired是要注入一个对象。
2.示例
@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; } }
①bean的注入方式
可以通过构造器进行注入,或者通过setter方法进行注入。注意要在类上添加@component注解,标记为一个bean,这样spring容器会扫描到。
我上面采用的是setter方法注入,将容器中已有的bean设置到静态变量中。
也可以使用构造器注入的方式
@autowired public testclass(autowiredtypecomponent component) { testclass.component = component; }
②nacos中配置的注入方式
通过setter方法进行注入,在setter方法上添加nacos注解,获取配置的值,将值设置到静态变量中。
3.补充
在实际开发中,我们也可以不使用静态工具类的方式,可以通过注解方式创建一个bean,在bean内直接注入nacos中的属性,并写一些方法,实际使用时,可以直接注入bean,然后进行使用。
使用静态工具类的方式,无需注入,可以直接使用。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论