【SpringBoot】如何在静态工具类中注入mapper?
问题描述
开发过程中偶尔遇到一个问题,一个工具类中的静态方法调用mybatis
的mapper
接口时,会出现@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?相关推荐
- SpringBoot项目中如何在静态工具类中使用被Spring容器管理的对象
在开发的过程中,难免会碰到需要在工具类中使用由spring管理的对象的情况,但是我们都知道,工具类中的静态方法中无法引用spirng容器中的对象(被spring管理的对象不是静态的,静态方法中无法调用 ...
- 关于springboot工具类中@Autowired注入bean,用static直接修饰,静态方法使用bean时报空指针异常错误...
错误场景: springboot + mybatis 在工具类的静态方法中,需要使用mapper(其他bean也一样),所以最开始直接使用@Autowired进行了注入,代码如下: @Autowire ...
- autowired 静态方法使用_关于springboot工具类中@Autowired注入bean,用static直接修饰,静态方法使用bean时报空指针异常错误...
错误场景: springboot + mybatis 在工具类的静态方法中,需要使用mapper(其他bean也一样),所以最开始直接使用@Autowired进行了注入,代码如下: @Autowire ...
- springboot中service中注入dao失败测试类中注入成功_聊一聊 Java 服务端中的乱象
查尔斯·狄更斯在<双城记>中写道:"这是一个最好的时代,也是一个最坏的时代." 移动互联网的快速发展,出现了许多新机遇,很多创业者伺机而动:随着行业竞争加剧,互联网红利 ...
- springboot在工具类中添加service的方法,显示为空的解决方案
springboot在工具类中添加service的方法,显示为空的解决方案 参考文章: (1)springboot在工具类中添加service的方法,显示为空的解决方案 (2)https://www. ...
- Web前端笔记-字符串自适应tip提示框(适应大小自动换行JS中静态工具类实现)思路
程序运行截图如下: 下面提几个知识点. 第一个是JS中实现静态类,如下utils.js export let HHUtils = {}HHUtils .StaticClass = (function( ...
- Winform中怎样在工具类中对窗体中多个控件进行操作(赋值)
场景 需求是在窗体加载完成后掉用工具类的方法,工具类中获取窗体的多个控件对象进行赋值. 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 ...
- SpringBoot 在main或者普通类中条用service接口
SpringBoot 在main或者普通类中条用service接口,对MyBatis进行测试 首先创建一个工具类 SpringUtils import org.springframework.bean ...
- Android中怎样在工具类中获取Context对象
场景 Android程序中访问资源时需要提供Context,一般来说只有在各种component中(Activity, Provider等等)才能方便的使用api来获取Context对象, 如果在编写 ...
最新文章
- HashSet中的add()方法( 一 )(详尽版)
- Sql Server相关报错解决
- 基于BindingSource的WinForm开发
- boost::mp11::mp_filter相关用法的测试程序
- Spring 属性配置
- HTML--HTML入门篇(我想10分钟入门HTML,可以,交给我吧)
- 解密 云HBase 冷热分离技术原理
- 文件服务器 权限和安全,NTFS安全权限、文件共享服务器
- 【转】矩阵十大经典题目
- MySQL备份/还原 Unknown storage engine 'InnoDB'
- 构造一个日期类java,java 日期类
- 软件吞噬世界之前 SDS还要解决这些问题
- Keil5二步解决中文乱码,注释乱码问题
- 手机连接wifi后无法上网
- OptionError: ‘Pattern matched multiple keys‘
- 字符串——BZOJ 3097: Hash Killer I【构造题,思维题】
- Silver Efex Pro 2 for Mac(黑白处理调试滤镜)
- “扫地机器人双子星”正在坠落之科沃斯
- 第十五章 VoIP 安全
- Windows环境下安装scrapy