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,然后进行使用。
使用静态工具类的方式,无需注入,可以直接使用。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
 
             我要评论
我要评论 
                                             
                                             
                                             
                                             
                                            
发表评论