springBoot解决static和@Component遇到的bug
⽬录
static和@Component遇到的bug
static和@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⼯作更加容易。
resource和autowired注解的区别⼀旦你使⽤静态⽅法,就不再需要去产⽣这个类的实例,这会让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() {
}
}
2、⽤@PostConstruct注解
@Component
public class Test {
private static UserService userService;
@Autowired
private UserService userService2;
@PostConstruct
public void beforeInit() {
userService = userService2;
}
public static void test() {
}
}
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论