问题描述

开发过程中偶尔遇到一个问题,一个工具类中的静态方法调用mybatismapper接口时,会出现@Autowired无法注入的问题,即使添加了这个注解,spring容器加载完成声明的参数也是空值。

原因

SpringFramework里,我们是不能@Autowired一个静态变量,使之成为一个Spring bean的。

为什么?其实很简单,因为当类加载器加载静态变量时,Spring上下文尚未加载。所以类加载器不会在bean中正确注入静态类,并且会失败。

解决方案

查资料发现,用static修饰的方法如果要调用mapper层时,可以用如下方式实现:

首先,在实体类上加上注解@Component,方便spring容器进行加载,然后定义如下:

/*** 在静态工具类中注入mapper的方式示例*/
@Component
public class CodeMapUtils {private static Logger LOGGER = LoggerFactory.getLogger(DoAllController.class);@Autowiredprivate CodeMapMapper codeMapMapper;private static CodeMapUtils codeMapUtils;@PostConstructpublic void init() {codeMapUtils = this;codeMapUtils.codeMapMapper = this.codeMapMapper;}public static String queryFromCodeMap(String key, String colName) {String value = codeMapUtils.codeMapMapper.getValueByKeyAndColName(key, colName);// do something...}
}

另外,spring中Constructor@Autowired@PostConstruct的顺序:

其实从依赖注入的字面意思就可以知道,要将对象p注入到对象a,那么首先就必须得生成对象a和对象p,才能执行注入。所以,如果一个类A中有个成员变量p被@Autowried注解,那么@Autowired注入是发生在A的构造方法执行完之后的。

如果想在生成对象时完成某些初始化操作,而偏偏这些初始化操作又依赖于依赖注入,那么久无法在构造函数中实现。为此,可以使用@PostConstruct注解一个方法来完成初始化,@PostConstruct注解的方法将会在依赖注入完成后被自动调用。

加载顺序:Constructor >> @Autowired >> @PostConstruct

【SpringBoot】如何在静态工具类中注入mapper?相关推荐

  1. SpringBoot项目中如何在静态工具类中使用被Spring容器管理的对象

    在开发的过程中,难免会碰到需要在工具类中使用由spring管理的对象的情况,但是我们都知道,工具类中的静态方法中无法引用spirng容器中的对象(被spring管理的对象不是静态的,静态方法中无法调用 ...

  2. 关于springboot工具类中@Autowired注入bean,用static直接修饰,静态方法使用bean时报空指针异常错误...

    错误场景: springboot + mybatis 在工具类的静态方法中,需要使用mapper(其他bean也一样),所以最开始直接使用@Autowired进行了注入,代码如下: @Autowire ...

  3. autowired 静态方法使用_关于springboot工具类中@Autowired注入bean,用static直接修饰,静态方法使用bean时报空指针异常错误...

    错误场景: springboot + mybatis 在工具类的静态方法中,需要使用mapper(其他bean也一样),所以最开始直接使用@Autowired进行了注入,代码如下: @Autowire ...

  4. springboot中service中注入dao失败测试类中注入成功_聊一聊 Java 服务端中的乱象

    查尔斯·狄更斯在<双城记>中写道:"这是一个最好的时代,也是一个最坏的时代." 移动互联网的快速发展,出现了许多新机遇,很多创业者伺机而动:随着行业竞争加剧,互联网红利 ...

  5. springboot在工具类中添加service的方法,显示为空的解决方案

    springboot在工具类中添加service的方法,显示为空的解决方案 参考文章: (1)springboot在工具类中添加service的方法,显示为空的解决方案 (2)https://www. ...

  6. Web前端笔记-字符串自适应tip提示框(适应大小自动换行JS中静态工具类实现)思路

    程序运行截图如下: 下面提几个知识点. 第一个是JS中实现静态类,如下utils.js export let HHUtils = {}HHUtils .StaticClass = (function( ...

  7. Winform中怎样在工具类中对窗体中多个控件进行操作(赋值)

    场景 需求是在窗体加载完成后掉用工具类的方法,工具类中获取窗体的多个控件对象进行赋值. 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 ...

  8. SpringBoot 在main或者普通类中条用service接口

    SpringBoot 在main或者普通类中条用service接口,对MyBatis进行测试 首先创建一个工具类 SpringUtils import org.springframework.bean ...

  9. Android中怎样在工具类中获取Context对象

    场景 Android程序中访问资源时需要提供Context,一般来说只有在各种component中(Activity, Provider等等)才能方便的使用api来获取Context对象, 如果在编写 ...

最新文章

  1. HashSet中的add()方法( 一 )(详尽版)
  2. Sql Server相关报错解决
  3. 基于BindingSource的WinForm开发
  4. boost::mp11::mp_filter相关用法的测试程序
  5. Spring 属性配置
  6. HTML--HTML入门篇(我想10分钟入门HTML,可以,交给我吧)
  7. 解密 云HBase 冷热分离技术原理
  8. 文件服务器 权限和安全,NTFS安全权限、文件共享服务器
  9. 【转】矩阵十大经典题目
  10. MySQL备份/还原 Unknown storage engine 'InnoDB'
  11. 构造一个日期类java,java 日期类
  12. 软件吞噬世界之前 SDS还要解决这些问题
  13. Keil5二步解决中文乱码,注释乱码问题
  14. 手机连接wifi后无法上网
  15. OptionError: ‘Pattern matched multiple keys‘
  16. 字符串——BZOJ 3097: Hash Killer I【构造题,思维题】
  17. Silver Efex Pro 2 for Mac(黑白处理调试滤镜)
  18. “扫地机器人双子星”正在坠落之科沃斯
  19. 第十五章 VoIP 安全
  20. Windows环境下安装scrapy

热门文章

  1. Qt界面开发(各种控件以及图表)
  2. 关于寻路算法的一些思考(3):A*算法的实现
  3. C++ COM编程之接口背后的虚函数表
  4. docker学习笔记(六)docker-compose
  5. 55万字,阿里内部最新最全Java面试进阶手册,能横扫95%的面试官
  6. MySQL三大日志及主从复制的原理
  7. Linux线程(二)
  8. 你会在你的WebRTC 应用程序中使用哪种视频编解码器呢?
  9. 我在攻读计算机视觉和机器学习硕士学位时学到了什么
  10. 实时远程医学影像服务质量保障与网络优化