温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

@Autowired和static有什么关系

发布时间:2021-08-27 11:23:28 来源:亿速云 阅读:226 作者:小新 栏目:开发技术

这篇文章主要介绍了@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;
        }
    }

    感谢你能够认真阅读完这篇文章,希望小编分享的“@Autowired和static有什么关系”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI