1.哪个优先?
静态代码快的加载顺序优先于spring的容器的注入
比如:我有一个类
@Component
public class TestService{
private Jedis jedis;
static{
RedisService redisService=ApplicationContentUtil.getBean(RedisService.class);
jedis=redisService.getResource();
}
public void incr(){
//redis命令方法
}
}
再上面的代码中通过静态内部类使用spring容器工具类获取注入的的service。
2.为什么报错?
因为静态代码块的加载顺序优先于容器,再调用静态代码快的时候,容器对象还没有被注入,
容器获取对象工具类如下:
@Component
public class ApplicationContentUtil implements ApplicationContentAware{
private static ApplicationContent applicationContent;
public void setApplicationContent(ApplicationContent applicationContent){
ApplicationContent.applicationContent=applicationContent;
}
public static <T> T getBean(Class<T> tclass){
return applicationContent.getBean(tclass);
}
}
这是一个获取容器内部的工具类,很常见,获取的方式可以进行自己进行扩展。
由于加载的顺序会导致application为null所以启动的时候会报空指针。
3.正确的写法
public class TestService{
private Jedis jedis;
static{
RedisService redisService=ApplicationContentUtil.getBean(RedisService.class);
jedis=redisService.getResource();
}
public static void incr(){
//redis命令方法
}
}
4.使用
然后我们就可以和平时使用静态工具类一样进行使用了
如:d
@Service
public class Test2Service(){
public void test1(){
TestService.incr();
}
}