springBoot解决static和@Component遇到的bug
作者:军大君 时间:2022-12-31 01:23:27
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();
}
}
来源:https://blog.csdn.net/weixin_42581660/article/details/121292424
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
java比较器Comparable接口与Comaprator接口的深入分析
Spring boot配置文件加解密详解
![](https://img.aspxhome.com/file/2023/3/59583_0s.jpg)
Java创建线程的五种写法总结
Android自定义UI实现微信语音
解决MyBatis @param注解参数类型错误异常的问题
C#实现异步GET的方法
Android编程中activity的完整生命周期实例详解
![](https://img.aspxhome.com/file/2023/5/137525_0s.png)
SpringCloud重试机制配置详解
![](https://img.aspxhome.com/file/2023/0/69710_0s.png)
springboot html调用js无效400问题及解决
![](https://img.aspxhome.com/file/2023/3/97943_0s.png)
五分钟手撸一个Spring容器(萌芽版)
![](https://img.aspxhome.com/file/2023/1/67181_0s.jpg)
java Semaphore共享锁实现原理解析
![](https://img.aspxhome.com/file/2023/5/61815_0s.jpg)
深入理解Java对象复制
![](https://img.aspxhome.com/file/2023/5/79295_0s.png)
Android Webview滑进出屏幕闪烁的解决方法
![](https://img.aspxhome.com/file/2023/8/116148_0s.gif)
Android App开发中HTTP扩展包OkHttp的入门使用指南
Java新API的时间格式化
![](https://img.aspxhome.com/file/2023/9/65319_0s.png)
Java实现多线程断点下载实例代码(下载过程中可以暂停)
![](https://img.aspxhome.com/file/2023/9/108459_0s.png)
Spring Cloud升级最新Finchley版本的所有坑
![](https://img.aspxhome.com/file/2023/3/88593_0s.png)
在C#中根据HardwareID获取驱动程序信息的实现代码
SpringBoot使用validation做参数校验说明
VS2019配置opencv详细图文教程和测试代码的实现
![](https://img.aspxhome.com/file/2023/8/100298_0s.png)