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

目录

1.说明

2.示例


1.说明

在代码开发中,经常会存在调用第三方工具或者其他系统的场景,通常封装成一个工具类供service进行调用,便于后期的维护及代码复用。工具类中的属性及方法都被static修饰,在工具类中不能使用和service中一样的注入Bean及引用Nacos值的方式。

2.不能给静态变量注入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注解,获取配置的值,将值设置到静态变量中。

你可能感兴趣的:(java常用,java,服务器)