详谈@Autowired和static的关系
@Autowired和static的关系
一、发生的场景
好几次有个同事因为把static用到Spring的@Autowired上,导致注入的对象一直报空指针,他一直找不到错误在哪里,来问我,其实我以前也不知道这个问题,但我根据Spring容器的特点判定,他调用的对象与注入的对象不是一个对象,就告诉他:static的加载顺序是在@Autowired之前;之后查资料才知道其实不是这样。。。
二、原理剖析
静态变量、类变量不是对象的属性,而是一个类的属性,所以静态方法是属于类(class)的,普通方法才是属于实体对象(也就是New出来的对象)的,spring注入是在容器中实例化对象,所以不能使用静态方法。
而使用静态变量、类变量扩大了静态方法的使用范围。静态方法在spring是不推荐使用的,依赖注入的主要目的,是让容器去产生一个对象的实例,然后在整个生命周期中使用他们,同时也让testing工作更加容易。
一旦你使用静态方法,就不再需要去产生这个类的实例,这会让testing变得更加困难,同时你也不能为一个给定的类,依靠注入方式去产生多个具有不同的依赖环境的实例,这种static field是隐含共享的,并且是一种global全局状态,Spring同样不推荐这样去做。
三、解决方案
1、将@Autowire加到构造方法上
@Component public class Test { private static UserService userService; @Autowired public Test(UserService userService) { Test.userService = userService; } public static void test() { userService.test(); } }
2、用@PostConstruct注解
@Component public class Test { private static UserService userService; @Autowired private UserService userService2; @PostConstruct public void beforeInit() { userService = userService2; } public static void test() { userService.test(); } }
static方法使用@Autowired
set注入失败 构造器注入成功
@Component @Slf4j public class UserCookieInfoUtil { private static RedisTemplate<String, String> redisTemplate; private static JWTUtils jwtUtils; @Autowired public UserCookieInfoUtil(JWTUtils jwtUtils, RedisTemplate<String, String> redisTemplate) { UserCookieInfoUtil.jwtUtils = jwtUtils; UserCookieInfoUtil.redisTemplate = redisTemplate; } public static Map<String, Object> getCookieInfo(String token) { Map<String, Object> map = new HashMap<>(); try { String loginName = jwtUtils.getLoginName(token); String info = redisTemplate.opsForValue().get(Constants.TOKEN_USER_INFO + ":" + loginName); map = JSONObject.parseObject(info == null ? "" : info, Map.class); } catch (Exception e){ log.error("获取缓存中的登录信息失败:{}", e); } return map; } }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持猪先飞。
相关文章
InterlliJ IDEA2020新建java web项目找不到Static Web的解决
这篇文章主要介绍了InterlliJ IDEA2020新建java web项目找不到Static Web的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-02- @Autowired 注解的主要功能就是完成自动注入,使用也非常简单,但这篇文章主要给大家介绍了关于Spring为什么不推荐使用@Autowired注解的相关资料,需要的朋友可以参考下...2021-11-03
- 这篇文章主要介绍了C#类中static变量用法,实例分析了static变量使用技巧与相关注意事项,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了C++类中的static和const用法,是C++面向对象程序设计中非常重要的概念,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了如何在C#9中使用static匿名函数,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下...2021-03-31
- 这篇文章主要给大家介绍了关于Swift中static和class关键字的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-06-30
- 这篇文章主要介绍了Java中的static关键字深入理解,有感兴趣的同学可以研究下...2021-03-01
- 以下是对static全局变量与普通的全局变量的区别进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助...2020-04-25
C++中四种对象生存期和作用域以及static的用法总结分析
以下是对C++中四种对象生存期和作用域以及static的用法进行了详细的介绍,需要的朋友可以过来参考下...2020-04-25理解Java注解及Spring的@Autowired是如何实现的
今天通过本文带领大家学习注解的基础知识,学习Spring的@Autowired是怎么实现的,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧...2021-07-11- 这篇文章主要为大家详细介绍了C++设计模式之Static Factory模式的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
- php中global和static两个关键字详解,有需要的朋友可参考一下。 1.global在整个页面起作用。 2.static只在function和class内起作用。 global和$GLOBALS使用基本...2016-11-25
- C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。本文重点给大家介绍c/c++ 中的static关键字,感兴趣的朋友跟随小编一起看看吧...2020-04-25
- 如果类的方法是static的,他所访问的属性也必须是static的。 、在类的内部方法访问未声明为const及static的属性时,使用$this->value ='class_a';的形式 class clss_a...2016-11-25
- 这篇文章主要介绍了Java父类继承中的static和final用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-10-08
- 这篇文章主要介绍了@Autowired和static的关系,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-08-26
- c++中的static关键字使得函数里面的局部变量的存活期不在局限于函数里面,而是变为在整个程序生命期里面都有效...2020-04-25
- 在C语言中,static的作用有三条:一是隐藏功能,二是保持持久性功能,三是默认初始化为0。本文重点给大家介绍C语言中static的作用及c语言中使用静态函数有何好处,对本文感兴趣的朋友一起看看吧...2020-04-25
- string是C++标准库的一个重要的部分,主要用于字符串处理。这篇文章主要介绍了C++ string的用法和例子,需要的朋友可以参考下...2020-04-25
C# 中const,readonly,static的使用小结
这篇文章主要介绍了C# 中使用const,readonly,static的示例,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-26