静态工具类中使用注解注入service

本文介绍如何在Spring框架中解决工具类静态方法注入Service的问题。通过创建单例并在@PostConstruct初始化方法中手动设置依赖,实现了在不破坏静态上下文的情况下注入Service。这种方法适用于需要在工具类中调用业务逻辑的情况。

一般需要在一个工具类中使用@Autowired 注解注入一个service。但是由于工具类方法一般都写成static,所以直接注入就存在问题。

使用如下方式可以解决:

[java] view plain copy
  1. /** 
  2.  *  
  3.  */  
  4. package cn.ffcs.drive.common.util;  
  5.   
  6. import javax.annotation.PostConstruct;  
  7. import javax.servlet.http.HttpServletRequest;  
  8.   
  9. import org.slf4j.Logger;  
  10. import org.slf4j.LoggerFactory;  
  11. import org.springframework.beans.factory.annotation.Autowired;  
  12. import org.springframework.stereotype.Component;  
  13.   
  14. import cn.ffcs.drive.domain.Admin;  
  15. import cn.ffcs.drive.domain.OpeLog;  
  16. import cn.ffcs.drive.service.IOpeLogService;  
  17. import cn.ffcs.zq.util.DateUtils;  
  18.   
  19. /** 
  20.  * className:OpeLogUtils 
  21.  *  
  22.  * 管理员操作日志 
  23.  *  
  24.  * @author pengyh 
  25.  * @version 1.0.0 
  26.  * @date 2014-07-10 09:04:48 
  27.  *  
  28.  */  
  29. @Component  
  30. public class OpeLogUtils {  
  31.   
  32.     private static Logger logger = LoggerFactory.getLogger(OpeLogUtils.class);  
  33.   
  34.     @Autowired  
  35.     private IOpeLogService opeLogService;  
  36.     private static OpeLogUtils opeLogUtils;  
  37.   
  38.     public void setUserInfo(IOpeLogService opeLogService) {  
  39.         this.opeLogService = opeLogService;  
  40.     }  
  41.       
  42.     @PostConstruct  
  43.     public void init() {  
  44.         opeLogUtils = this;  
  45.         opeLogUtils.opeLogService = this.opeLogService;  
  46.   
  47.     }  
  48.   
  49.     /** 
  50.      * 执行操作日志入库操作 
  51.      * @param adminId   管理员id 
  52.      * @param opeDesc   操作日志信息 
  53.      * @param cityCode  城市编码 
  54.      */  
  55.     public static void insertOpeLog(HttpServletRequest req, String opeDesc) {  
  56.         try {  
  57.             /** 
  58.              * 获取管理员信息 
  59.              */  
  60.             Admin admin = DriveUtil.getSessionUser(req);  
  61.               
  62.             if(admin != null && opeDesc != null && !opeDesc.trim().equals("")){  
  63.                   
  64.                 //封装日志信息  
  65.                 logger.info("开始封装日志信息。");  
  66.                 OpeLog opeLog = new OpeLog();  
  67.                   
  68.                 opeLog.setAdminId(admin.getId());  
  69.                 opeLog.setCityCode(admin.getCityCode());  
  70.                 opeLog.setOpeDesc("管理员id="+admin.getId()+"操作【"+opeDesc+"】");  
  71.                 opeLog.setOpeTime(DateUtils.getNow());  
  72.                 opeLog.setIsDelete("0");  
  73.                 opeLogUtils.opeLogService.save(opeLog);  
  74.                   
  75.                 logger.info("保存管理员操作日志成功,信息为【adminId:{},cityCode:{},opeDesc:{},opeTime:{}】",new Object[]{admin!=null?admin.getId():null,admin.getCityCode(),opeDesc,DateUtils.getNow()});  
  76.             }else{  
  77.                 logger.info("保存操作日志失败,参数不足【adminId:{},cityCode:{},opeDesc:{},opeTime:{}】",new Object[]{admin!=null?admin.getId():null, admin!=null?admin.getCityCode():null, opeDesc, DateUtils.getNow()});  
  78.             }  
  79.         } catch (Exception e) {  
  80.             logger.error("保存操作日志异常,异常信息为:" + e.getMessage(), e);  
  81.         }  
  82.     }  
  83.   

转载于:https://my.oschina.net/u/1582930/blog/519952

### 解决 Db 静态工具类不可用的问题 在 MyBatis-Plus 中,`Db` 类是一个常用的静态工具类,用于简化数据库操作。然而,在某些情况下可能会遇到 `Db` 工具类不可用的问题。这通常是因为项目中引入的 MyBatis-Plus 版本较低或者未正确配置相关依赖。 #### 问题原因分析 1. **版本过低**:早期版本的 MyBatis-Plus 并未提供完整的 `Db` 工具类支持[^3]。 2. **依赖缺失**:如果项目的 Maven 或 Gradle 文件中缺少必要的依赖项,则可能导致功能无法正常使用。 3. **Spring 容器管理问题**:即使依赖已正确添加,但如果工具类未被 Spring 容器托管,也可能引发空指针异常等问题[^2]。 #### 解决方案 以下是针对上述问题的具体解决方案: 1. **升级 MyBatis-Plus 至最新版本** 确保项目中的 MyBatis-Plus 依赖已经更新至至少 3.x 的稳定版本(如 3.5.3)。可以通过修改 `pom.xml` 文件来实现: ```xml <!-- MyBatis-Plus 核心依赖 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3</version> </dependency> <!-- Generator 模块 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.5.3</version> </dependency> ``` 2. **确认工具类是否已被 Spring 托管** 如果需要在工具类中注入其他 Bean 对象(例如 DAO 层接口),则应将其纳入 Spring 容器管理范围。具体做法是在工具类上添加 `@Component` 注解,并确保其所在包已在 Spring 配置文件中声明扫描路径: ```java @Component public class CustomTool { @Autowired private SomeService someService; public void execute() { // 调用 service 方法 someService.doSomething(); } } ``` 同时,在 Spring 配置文件中加入如下内容以启用组件扫描: ```xml <context:component-scan base-package="com.example.package"/> ``` 3. **验证 Db 工具类的功能** 升级完成后,可以直接测试 `Db` 工具类的核心方法是否正常工作。以下是一些常见的使用场景示例: ```java import com.baomidou.mybatisplus.core.toolkit.Db; public class TestMain { public static void main(String[] args) { // 插入数据 boolean insertResult = Db.insert("INSERT INTO user (name, age) VALUES ('Tom', 20)"); // 查询单条记录 Map<String, Object> resultMap = Db.queryMap("SELECT * FROM user WHERE id = ?", 1); System.out.println("Insert Result: " + insertResult); System.out.println("Query Result: " + resultMap); } } ``` 4. **排查潜在错误** 若仍然存在问题,建议通过日志查看具体的异常堆栈信息并逐一排除可能性。例如,检查是否存在拼写错误、SQL 语法问题或其他外部因素干扰。 --- ### 总结 通过对 MyBatis-Plus 的版本控制以及 Spring 容器的有效利用,能够有效解决 `Db` 静态工具类不可用的问题。务必保持框架及相关库处于较新状态以便获得更好的兼容性和稳定性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值