“年年花落无人见,空逐春泉出御沟”
序
我们系统有个发送短信的工具类,之前一直没有记录发送短息的日志,现在要做个发送短信之后记录日志的功能,于是在工具类中用到了@Autowired注入mapper来执行插入SQL语句。
问题
这里遇到的问题是:1、一般工具类中的方法都是静态的,而在静态方法中又不能直接使用注入的mapper。如:
//注入
@Autowired
private SmsLogMapper mapper;
//方法
public static String sendSms(String mobile) {
//这里不能直接用mapper,因为mapper不是静态
}
2、第二个问题是,如果把mapper改为静态的,则在方法中使用时,mapper就是null。
解决方法
- 在工具类上添加
@Component
注解将工具类实例到spring容器中; - 使用
@PostConstruct
注解初始化工具类和mapper,如下:
@Autowired
private SmsLogMapper mapper;
//当前工具类
private static SendSms sendSmsUtil;
//解决静态方法中不能直接用mapper的问题
@PostConstruct
public void init() {
sendSmsUtil = this;
sendSmsUtil.mapper = this.mapper;
}
注:@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。
- 在方法中这样调用:
//插入日志
sendSmsUtil.mapper.insertSmsLog();
这样就解决了工具类中注入为null的问题了。
本文参考至:关于工具类中@Autowired注入为NULL的问题记录