spring给静态成员注入 你试过吗?

给静态成员注入 你试过吗?

public class TempDataTransformUtilDto {@Autowiredprivate static ICityCascadeService cityCascadeService;private static CstShareEmpMapper cstShareEmpMapper;private static PubUserInfoMapper pubUserInfoMapper;
}

如果ICityCascadeService 通过@Service 注入的,@Autowired在这里是不管用的。

在使用时 会报错NullPointer !!!

理解:

1.类成员的初始化较早,并不需要依赖实例的创建,所以这个时候Spring容器可能都还没“出生”,谈何依赖注入呢?

2.当类加载器加载静态变量时,Spring的上下文环境还没有被加载。

3.AutowiredAnnotationBeanPostProcessor类源码,扫描Class类需要注入的元数据的时候,直接选择忽略掉了static成员(包括属性和方法)。

AutowiredAnnotationBeanPostProcessor// 构建@Autowired注入元数据方法
// 简单的说就是找到该Class类下有哪些是需要做依赖注入的
private InjectionMetadata buildAutowiringMetadata(final Class<?> clazz) {...// 循环递归,因为父类的也要管上do {// 遍历所有的字段(包括静态字段)ReflectionUtils.doWithLocalFields(targetClass, field -> {if (Modifier.isStatic(field.getModifiers())) {logger.info("Autowired annotation is not supported on static fields: " + field);}return;...});// 遍历所有的方法(包括静态方法)ReflectionUtils.doWithLocalMethods(targetClass, method -> {if (Modifier.isStatic(method.getModifiers())) {logger.info("Autowired annotation is not supported on static methods: " + method);}return;...});...targetClass = targetClass.getSuperclass();} while (targetClass != null && targetClass != Object.class);...
静态变量(成员)它是属于类的,而非属于实例对象的属性;
同样的静态方法也是属于类的,普通方法(实例方法)才属于对象。而Spring容器管理的都是实例对象

但是有时候 我们会想要去注入到静态成员 比如在工具类中使用static方法,这时我们就需要使用static属性,而这些属性又必须注入。

所以说 spring是不会去注入的,需要我们自己想办法~~ 也就是等实例都创建好了 再自己注入

解决方案一:使用@PostConstruct注解

@PostConstruct用来修饰一个非静态的void方法,当bean创建完成的时候,会后置执行@PostConstruct修饰的方法,并且只运行一次。

可以将static变量延迟初始化,在能够注入后进行初始化。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

@Component
public class RedisUtil {

private static RedisTemplate<Object, Object> redisTemplates;@Autowired
private RedisTemplate<Object, Object> redisTemplate;@PostConstruct
public void initialize() {redisTemplates = this.redisTemplate;
}/*** 添加元素** @param key* @param value*/
public static void set(Object key, Object value) {if (key == null || value == null) {return;}redisTemplates.opsForValue().set(key, value);
}

存在的问题:得保证在bean初始化之前,这个工具类的static方法不会被调用。

方法二:

写一个构造方法

@Component
public class TempDataTransformUtilDto {private static ICityCascadeService cityCascadeService;private static CstShareEmpMapper cstShareEmpMapper;private static PubUserInfoMapper pubUserInfoMapper;private static CustPersonMapper custPersonMapper;private static CstOrganizationMapper cstOrganizationMapper;private static CustBaseInfoMapper custBaseInfoMapper;@Autowiredpublic TempDataTransformUtilDto(ICityCascadeService cityCascadeService, CstShareEmpMapper cstShareEmpMapper, PubUserInfoMapper pubUserInfoMapper,CustPersonMapper custPersonMapper,CstOrganizationMapper cstOrganizationMapper,CustBaseInfoMapper custBaseInfoMapper) {TempDataTransformUtilDto.cityCascadeService = cityCascadeService;TempDataTransformUtilDto.cstShareEmpMapper = cstShareEmpMapper;TempDataTransformUtilDto.pubUserInfoMapper = pubUserInfoMapper;TempDataTransformUtilDto.custPersonMapper = custPersonMapper;TempDataTransformUtilDto.cstOrganizationMapper = cstOrganizationMapper;TempDataTransformUtilDto.custBaseInfoMapper = custBaseInfoMapper;}

方法三:

不再需要标注@Component注解

public class UserHelper {static UCClient ucClient;@Autowiredpublic void setUcClient(UCClient ucClient) {UserHelper.ucClient = ucClient;}
}
  1. 手动管理这种case的依赖注入,更可控。而非交给Spring容器去自动处理
  2. 工具类本身并不需要加入到Spring容器内,这对于有大量这种case的话,是可以节约开销的

参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/147016.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java重写和重载的区别,

Java中的重写&#xff08;Override&#xff09;和重载&#xff08;Overload&#xff09;都是面向对象编程的重要概念&#xff0c;它们的区别如下&#xff1a; 在定义上&#xff1a; 重载是在同一个类中定义多个方法&#xff0c;它们的方法名相同但参数不同。 重写是子类重新定义…

C++ 继承和派生

继承和派生 一个新类从已有的类那里获得其已有特性&#xff0c;这种现象称为类的继承。 从父类产生一个子类&#xff0c;称为派生。 基类与派生类的关系&#xff1a;派生类是基类的具体化&#xff0c;而基类是派生类的抽象。 定义基类和派生类 定义基类 例&#xff1a;一个…

rabbitMQ的扇出模式(fanout发布订阅)的生产者与消费者使用案例

扇出模式 fanout 发布订阅模式 生产者 生产者发送消息到交换机&#xff08;logs&#xff09;,控制台输入消息作为生产者的消息发送 package com.esint.rabbitmq.work03;import com.esint.rabbitmq.RabbitMQUtils; import com.rabbitmq.client.Channel;import java.util.Scanne…

使用FP8加速PyTorch训练

现代的人工智能硬件架构(例如&#xff0c;Nvidia Hopper, Nvidia Ada Lovelace和Habana Gaudi2)中&#xff0c;FP8张量内核能够显著提高每秒浮点运算(FLOPS)&#xff0c;以及为人工智能训练和推理工作负载提供内存优化和节能的机会。 在这篇文章中&#xff0c;我们将介绍如何修…

Arduino驱动LM35线性温度传感器(温湿度传感器)

目录 1、传感器特性 2、控制器和传感器连线图 3、驱动程序 LM35半导体的温度传感器,可以用来对环境温度进行定性的检测。LM35半导体温度传感器是美国国家半导体公司生产的线性温度传感器。其测温范围是-40℃到150℃,灵敏度为10mV/℃,输出电压与温度成正比。

<C++> 反向迭代器

我们知道正向迭代器的设计&#xff1a;begin迭代器指向第一个数据&#xff0c;end迭代器指向最后一个数据的下一个位置 。移向下一个数据&#xff0c;解引用得到数据的值&#xff0c;并根据容器储存方式的不同&#xff0c;容器有不同类型的迭代器。 注意&#xff1a;rbegin迭代…

c语言:模拟实现qsort函数

qsort函数的功能&#xff1a; qsort相较于冒泡排序法&#xff0c;不仅效率更快&#xff0c;而且能够比较不同类型的元素&#xff0c;如&#xff1a;浮点数&#xff0c;结构体等等。这里我们来模拟下qsort是如何实现这一功能的&#xff0c;方便我们对指针数组有一个更深层次的理…

龙芯 操作系统选择和安装

龙芯3a5000及之后的cpu底层架构已经从mips64el改为了loongarch64 所以这里分了2种来说明&#xff0c;分别对应3a4000之前的和3a5000之后的 龙芯的系统安装难点在于操作系统的选取和引导 一、烧录工具 制作安装盘使用常规的烧录工具是不行滴&#xff0c;会提示没有\boot\initrd…

webpack的安全保障是怎么做的?

文章目录 前言Webpack 内容安全策略后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;webpack &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出现错误&#xff0c;感…

阿里云linux升级新版本npm、nodejs

在阿里云服务器上编译部署NextJS工程发现 alibaba linux默认yum install npm安装的版本太低, 使用以下方式升级node、npm新版本。 1、卸载现有版本 yum remove nodejs npm -y2、安装新版本 sudo yum install https://rpm.nodesource.com/pub_21.x/nodistro/repo/nodesource-…

STM32的启动流程

1、STM32上电启动的主要步骤 a、初始化堆栈指针sp_initial_sp&#xff0c;初始化PC指针pcReset_Handler。 b、初始化中断向量表。 c、配置系统时钟。 d、调用 C 库函数_main 初始化用户堆栈&#xff0c;然后进入 main 函数。 2、STM32的三种启动模式 复位后&#xff0c;在 S…

从底层原理看Android的序列化是如何实现的

对于Java的序列化&#xff0c;我们可以认为是在数据传输的时候的一套协议或者是一个标准&#xff0c;因为Java存在自己特定的一个数据结构&#xff08;class&#xff09;&#xff0c;举个例子 data class User(val name: String,val age: Int )User是一个对象&#xff0c;我们…

产品经理必备技能:如何快速锁定种子用户群体?

大家好&#xff0c;我是小米&#xff0c;一名热爱技术、热衷分享的90后小青年。今天我们要探讨的话题是一个在产品经理面试中经常被问到的问题&#xff1a;“产品上线后的种子用户该如何获取&#xff1f;”作为一个热爱挑战、乐于探讨的小伙伴&#xff0c;我将和大家分享一些我…

一、MySQL.pratice.search

MySQL是一种常用的关系型数据库管理系统&#xff0c;广泛应用于各种Web应用程序中。在编程中&#xff0c;使用MySQL进行数据操作是非常常见的操作。在MySQL中&#xff0c;查询是最常用的操作之一&#xff0c;可以查询整个表或者根据特定的条件查询数据。 文章目录 一、查询&am…

第七部分:Maven(项目管理工具)

目录 Maven简介 7.1&#xff1a;为什么学习Maven&#xff1f; 7.1.1、Maven是一个依赖管理工具 7.1.2&#xff1a;Maven是一个构建工具 7.1.3&#xff1a;结论 7.2&#xff1a;Maven介绍 7.3&#xff1a;Maven的优点 Maven安装和配置 7.4&#xff1a;安装教程及环境配置 …

Linux给根目录扩容

需求&#xff1a;Linux系统挂载到根目录的磁盘空间满了&#xff0c;如何扩容&#xff1f; 一、添加磁盘并分区 [rootcdn ~]# fdisk /dev/sdbWelcome to fdisk (util-linux 2.37.2). Changes will remain in memory only, until you decide to write them. Be careful before u…

什么是Java伪随机数,基础打牢。 #程序员 #Java #编程

你一定听说过这样一个词&#xff0c;伪随机数&#xff0c;你有没有这样的疑惑&#xff0c;为什么不用真随机&#xff0c;要用的个假的&#xff1f; 先说一个结论&#xff1a; Java Random英/ˈrndəm/ 随机数生成不安全&#xff0c;如果同时泄漏第一个和第二个随机数&#xf…

uniapp自定义组件

在UniApp中&#xff0c;你可以使用自定义组件来拓展应用程序的功能和界面。自定义组件是由多个Vue组件构成的&#xff0c;可以在应用程序中重复使用。 要创建一个自定义组件&#xff0c;你需要在UniApp项目中的components目录下创建一个新的文件夹&#xff0c;并在该文件夹中创…

最大似然估计的介绍

最大似然估计&#xff08;Maximum Likelihood Estimation&#xff0c;简称MLE&#xff09;是一种用于估计概率分布中参数的方法。该方法的核心思想是选择使得观察到的数据在给定模型下出现的概率最大的参数值作为估计值。 最大似然估计具有很好的性质&#xff0c;包括渐进正态性…

SystemVerilog学习 (9)——随机化

目录 一、概述 二、随机化 2.1、如何简单地产生一个随机数 2.1.1 利用系统函数产生随机数 2.1.2 urandom() 2.2、什么需要随机化 2.3、随机约束 2.3.1 rand 和 randc 2.3.2 随机约束的使用 2.3.3 约束块 三、总结 一、概述 随着设计变得越来越大,要产生一个完整的激…