前言
我们在工具类中引入spring ioc容器中,在static 方法中使用需要使用。放在该ioc容器上面报Non-static field ‘jedisCluster’ cannot be referenced from a static context 这种错误。这个是因为spring 初始化容器的速度,可能会慢于工具类报错的速度导致该方法调用失败。
实践
我们遇到这种问题,一般会有两种方案。第一个是将该对象作为方法调用传参使用。特别是当该工具类的使用普遍、方法比较多的情况显得很麻烦。第二种、通过调用的时候利用ApplicationContext.getBean() 的方式进行初始化。这个利用到spring ioc容器的时候调用勾子方法来对ApplicationContext 初始化。
我们这里就在ware 这个阶段调用ApplicationContext 对应勾子方法对其进行初始化。
代码:
@Component
public class SpringUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext;
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
@Override
public void setApplicationContext(@NonNull ApplicationContext applicationContext) {
SpringUtils.applicationContext = applicationContext;
}
public static Object getBean(String name) {
return applicationContext.getBean(name);
}
public static <T> T getBean(Class<T> requiredType) {
return applicationContext.getBean(requiredType);
}
public static <T> T getBean(String name, Class<T> requiredType) {
return applicationContext.getBean(name, requiredType);
}
public static boolean containsBean(String name) {
return applicationContext.containsBean(name);
}
public static boolean isSingleton(String name) {
return applicationContext.isSingleton(name);