在开发中,我们经常会定义一些工具类,这些类中一般都是静态方法。使用时,直接使用类名.方法名调用即可,无需把工具类实例化。例如如下的工具类:
public class Test {
public static int add(int a, int b) {
return a + b;
}
}
使用时, 直接调用
int result = Test.add(1, 1);
但有的时候,我们的工具类可能会需要使用Spring的bean容器中定义的一些单例bean的方法来辅助计算,比如:
public class Test {
@Autowired
private XXService xxService; // 注意,这是spring中的一个单例bean
public static int add(int a, int b) {
// 这里会收到报错:Cannot make a static reference to the non-static field aservice
int c = xxService.doSomething(a);
return c + b;
}
}
这时该怎么办呢,我这里提供一个我认为比较好的方式来实现(其实有多重方法来做)。
第一步,使用注解@Component将Test交给Spring容器来管理,这样才能让Test在初始化时注入XXService的实例
第二步,在Test类中创建一个自己类型的静态变量,用于后续的调用
第三步,使用注解@PostConstruct(这是在构造函数执行后执行的初始化动作)的方法,来将Test对象自己的实例赋给自己类型的静态变量。
第四步,把原来Test的静态add方法,变为成员方法
完整代码如下:
@Component // 第一步
public class Test {
public static Test INSTANCE; // 第二步
@PostConstruct // 第三步
public void init() {
INSTANCE = this;
}
@Autowired
private AService aservice;
public int add(int a, int b) { // 第四步,去掉static
aservice.service();
return a + b;
}
}
后面的调用就简单了,改为:
Test.INSTANCE.add(1, 1);
OK!