springBoot解决static和@Component遇到的bug

网友投稿 562 2022-08-28


springBoot解决static和@Component遇到的bug

目录static和@Component遇到的bugstatic和@Componet的名词解释@Autowired和static的关系发生的场景原理剖析  解决方案

static和@Component遇到的bug

今天在编写util的时候,发现不能调用到工具类里面的方法,转眼一看,原来不是工具类里面的方法是static类型的,使用@Resource注入进来没有效果。

static和@Componet的名词解释

static

用static声明的成员变量为静态成员变量,他从属于类,只能通过类名直接调用;

普通变量和方法从属于对象,需要new才可以调用静态方法不能调用非静态成员,编译会报错

@Componet

该注解是spring的一个注解,它的作用是实现bean的注入,这样的话我们就可以通过@Autowired和@Resource来进行注入到service层下了进行调用

@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();

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:python判断入参的字符串是否为全部中文(不包括中文符号)或者全部英文(包括英文符号)
下一篇:python之内置函数ord函数 || 内置函数char函数(python ord函数)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~