一个类中的非静态成员注入方式很是常见,但有一天我须要写一个工具类,这个工具类中的方法都是静态方法,所以成员必须是静态成员。我用到了Redis查询,获取redis的方法并不是静态方法,而是一个spring注入的bean。java
如何在静态类(类中的方法都为静态)中,用spring注入静态成员呢?redis
@Autowired private static RedisHelperManager redisHelperManager;
这样确定是不行的!,而且在用到该变量时会抛出运行时异常java.lang.NullPointerException
,为何呢?静态变量不属于对象的属性,属于类属性,spring是基于对象层面的注入。spring
经过搜索,主要有如下三种实现方式:函数
@PostConstruct
方式注入@PostConstruct
方式的变形除第3种外,其余都是从网上搜集整理。工具
有人说这是spring官方在乎识到对静态变量支持不友好后推出的方式,我并无找到官方文档,但它倒是能够。也是一个最简单且容易理解的方式。this
将注解放在setter方法之上code
@Component public class DistinctUtil { private static RedisHelper redisHelper; @Autowired public void setRedisHelper(RedisHelper redisHelper) { DistinctUtil.redisHelper = redisHelper; } public static void doDistinct() { redisHelper.sdiff(); } }
public class DistinctUtil { private static RedisHelper redisHelper; public void setRedisHelper(RedisHelper redisHelper) { DistinctUtil.redisHelper = redisHelper; } public static void doDistinct() { // 为演示精简代码 redisHelper.sdiff(); } }
<bean class="cn.com.dotleo.DistinctUtil"> <property name="redisHelper" ref="redisHelper"/> </bean>
@PostConstruct
方式注入这种方式是我在网上搜到的另外一种注入方式,@PostConstruct
和 @PreDestroy
一个是在初始化以后调用,一个是在销毁以前调用。这里用到了@PostConstruct
,在初始化后将一个对象赋值给了该类的静态变量。xml
@Component public class DistinctUtil { @Autowired private RedisHelper redisHelper; private static DistinctUtil distinctUtil; @PostConstruct public void init() { this.redisHelper = redisHelper; distinctUtil = this; } public static void doDistinct() { distinctUtil.redisHelper.sdiff(); } }
public class DistinctUtil { private RedisHelper redisHelper; private static DistinctUtil distinctUtil; public void init() { this.redisHelper = redisHelper; distinctUtil = this; } public static void doDistinct() { distinctUtil.redisHelper.sdiff(); } public void setRedisHelper(RedisHelper redisHelper) { this.redisHelper = redisHelper; }
<bean class="cn.com.dotleo.DistinctUtil" init-method="init"> <property name="redisHelper" ref="redisHelper"/> </bean>
@PostConstruct
方式的变形既然能够在初始化以后赋值,那也必然能够在初始化时赋值,所以想到了第三种方法。对象
##基于注解的方式文档
@Component public class DistinctUtil { private static DistinctUtil instance; @Autowired private RedisHelper redisHelper; public DistinctUtil() { instance = this; } public static void doDistinct() { // 为演示精简代码 instance.redisHelper.sdiff(); } }
这样,spring注入一个DistinctUtil类,并自动注入RedisHelper,在构造函数中将该类赋值给了静态的成员变量。以后能够经过该成员变量调用注入的redisHelper的方法。
public class DistinctUtil { private static DistinctUtil instance; private RedisHelper redisHelper; public DistinctUtil(RedisHelper redisHelper) { this.redisHelper = redisHelper; instance = this; } public static void doDistinct() { // 为演示精简代码 instance.redisHelper.sdiff(); } }
<bean class="cn.com.dotleo.DistinctUtil"> <constructor-arg name="redisHelper" ref="redisHelper"/> </bean>
因为本人水平有限,只是从网上搜集方法并记录备忘,若是能帮助到别人很是荣幸。但我并非很清楚这两类方式(第1种为一类,二、3种为一类)的区别或者优缺点,烦请评论区赐教。