欢迎来到徐庆高(Tea)的个人博客网站
磨难很爱我,一度将我连根拔起。从惊慌失措到心力交瘁,我孤身一人,但并不孤独无依。依赖那些依赖我的人,信任那些信任我的人,帮助那些给予我帮助的人。如果我愿意,可以分裂成无数面镜子,让他们看见我,就像看见自己。察言观色和模仿学习是我的领域。像每个深受创伤的人那样,最终,我学会了随遇而安。
当前位置: 日志文章 > 详细内容

静态工具类中注入Bean及引用Nacos配置方式

2025年08月23日 Java
1.说明在代码开发中,经常会存在调用第三方工具或者其他系统的场景,通常封装成一个工具类供service进行调用,便于后期的维护及代码复用。工具类中的属性及方法都被static修饰,在工具类中不能使用和

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,然后进行使用。

使用静态工具类的方式,无需注入,可以直接使用。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。