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

 更新时间:2025年07月24日 08:50:02   作者:linab112  
在Spring开发中,静态工具类无法注入Bean或Nacos值,因静态变量加载时Spring上下文未初始化,建议通过@Component标记Bean,使用构造器或Setter注入依赖,或直接在Bean内处理Nacos配置,实现灵活调用

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

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java的volatile和sychronized底层实现原理解析

    Java的volatile和sychronized底层实现原理解析

    文章详细介绍了Java中的synchronized和volatile关键字的底层实现原理,包括字节码层面、JVM层面的实现细节,以及锁的类型和MESI协议在多核处理器中的作用,文章还探讨了synchronized和volatile的区别,以及如何通过Atomic类来实现更细粒度的原子操作,感兴趣的朋友一起看看吧
    2025-03-03
  • Mybatis中SqlSession接口中selectList方法详解

    Mybatis中SqlSession接口中selectList方法详解

    这篇文章主要给大家介绍了关于Mybatis中SqlSession接口中selectList方法的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-03-03
  • 解析JPA的视图查询问题

    解析JPA的视图查询问题

    这篇文章主要是对JPA的视图查询问题进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2013-12-12
  • springboot配置Jackson返回统一默认值的实现示例

    springboot配置Jackson返回统一默认值的实现示例

    在项目开发中,我们返回的数据或者对象没有的时候一般直接返回的null,那么如何返回统一默认值,感兴趣的可以了解一下
    2021-07-07
  • java实现二叉树遍历的三种方式

    java实现二叉树遍历的三种方式

    这篇文章主要为大家详细介绍了java实现二叉树遍历的三种方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • IDEA 报Plugin'maven-resources-plugin:'not found 的解决方案

    IDEA 报Plugin'maven-resources-plugin:'not found 

    如果在使用 IDEA 时遇到 "Plugin 'maven-resources-plugin:' not found" 错误,可能是由于 Maven 仓库中未找到所需的 Maven 插件,近小编给大家分享几种解决方法,感兴趣的朋友跟随小编一起看看吧
    2023-07-07
  • Java实现的剪刀石头布游戏示例

    Java实现的剪刀石头布游戏示例

    这篇文章主要介绍了Java实现的剪刀石头布游戏,涉及java随机数生成及逻辑判定等相关操作技巧,需要的朋友可以参考下
    2017-12-12
  • Windows10安装IDEA 2020.1.2的方法步骤

    Windows10安装IDEA 2020.1.2的方法步骤

    这篇文章主要介绍了Windows10安装IDEA 2020.1.2的方法步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Java使用分布式实现数据库读写分离的示例代码

    Java使用分布式实现数据库读写分离的示例代码

    在MySQL中可以通过配置主从复制来实现数据同步,本文主要介绍了Java使用分布式实现数据库读写分离,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • Spring中的两种代理JDK和CGLIB的区别浅谈

    Spring中的两种代理JDK和CGLIB的区别浅谈

    本篇文章中主要介绍了Spring中的两种代理JDK和CGLIB的区别浅谈,详解的介绍了JDK和CGLIB的原理和方法,有需要的朋友可以了解一下
    2017-04-04

最新评论