前言
在探讨本文的主题前,我们要先知道几个前提:
- Util类的方法一般都是static类型的,方便用户去调用,比如:
ObjectUtil.isNotEmpty()
HttpUtil.sendPost()
。 - Spring框架中在使用Service时,一般都会使用框架自带的自动注入机制,让Spring帮我们管理Bean对象的创建与销毁。
- static类型的方法是由
类名.方法名()
直接调用的,并非使用类的对象进行调用。
分析
对于如何在Util类的静态方法使用Service这个问题,作为一个 CV战士 的第一印象可能是想使用类似Controller层一样的自动注入注解,如:@Autowired
、 @AllArgsConstructor
,但是我们发现代码在运行时自动注入并没生效,报空指针异常。也就是说自动注入注解对static类型的变量并不生效。
既然这样我就写一个static类型的Service占个坑,先不自动注入。
// 企微通用工具
// 使用@Component注解表示该类的实例化由Spring管理
public class WeWorkUtil {
// 企微相关参数
public static MessagePushWeWorkProperties weWorkProperties;
// 企微发送消息的方法
public static boolean sendMsg(String userId, String content) {
//此处为方法逻辑,需要调用静态成员变量
String xxx = weWorkProperties.get("xxx");
}
}
这个工具类如果就保持这样的话那就跟Spring一毛钱关系没有,因为该类没有标明需要Spring进行管理,所以我们要在类上加入一个@Component
注解,使用Spring框架完成后边的变量注入。
方法一:使用Autowire
加入一个成员方法, 使得静态成员变量可以被正常赋值。
// 使用@Component注解表示该类的实例化由Spring管理
@Component
public class WeWorkUtil {
// 静态成员变量
public static MessagePushWeWorkProperties weWorkProperties;
// 使用注解修饰方法
@Autowired
public void setWeWorkProperties(MessagePushWeWorkProperties weWorkProperties) {
WeWorkUtil.weWorkProperties = weWorkProperties;
}
// 企微发送消息的方法
public static boolean sendMsg(String userId, String content) {
//此处为方法逻辑,需要调用静态成员变量
String xxx = weWorkProperties.get("xxx");
}
}
这里我们在一个方法上加入@Autowired
注解,使得该方法能在容器对Bean初始化时执行,并且入参类型声明为静态成员变量的类型,因为Spring会自动注入方法的入参,那么在方法内部我们就可以将已创建完毕的入参变量赋值给静态成员变量,完成静态成员变量的赋值。
方法二:使用static代码块
private static IDictService dictService;
static {
dictService = SpringUtil.getBean(IDictService.class);
}
@Component
public class WeWorkUtil {
// 静态成员变量
public static MessagePushWeWorkProperties weWorkProperties;
// 使用静态代码块及springUtil获取对象
static {
weWorkProperties= SpringUtil.getBean(MessagePushWeWorkProperties .class);
}
// 企微发送消息的方法
public static boolean sendMsg(String userId, String content) {
//此处为方法逻辑,需要调用静态成员变量
String xxx = weWorkProperties.get("xxx");
}
}