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

标签:springBoot,static,@Component
0
投稿

猜你喜欢

  • java比较器Comparable接口与Comaprator接口的深入分析

    2022-01-20 11:51:09
  • Spring boot配置文件加解密详解

    2023-11-12 00:17:29
  • Java创建线程的五种写法总结

    2023-01-10 04:39:34
  • Android自定义UI实现微信语音

    2022-04-18 10:47:41
  • 解决MyBatis @param注解参数类型错误异常的问题

    2023-12-01 06:41:45
  • C#实现异步GET的方法

    2022-08-17 11:52:55
  • Android编程中activity的完整生命周期实例详解

    2022-12-24 05:39:40
  • SpringCloud重试机制配置详解

    2023-05-13 23:48:46
  • springboot html调用js无效400问题及解决

    2023-06-24 02:11:54
  • 五分钟手撸一个Spring容器(萌芽版)

    2021-07-29 02:41:54
  • java Semaphore共享锁实现原理解析

    2021-11-02 23:12:38
  • 深入理解Java对象复制

    2021-10-06 05:39:27
  • Android Webview滑进出屏幕闪烁的解决方法

    2021-11-30 11:57:33
  • Android App开发中HTTP扩展包OkHttp的入门使用指南

    2023-10-01 11:11:28
  • Java新API的时间格式化

    2023-02-14 19:24:37
  • Java实现多线程断点下载实例代码(下载过程中可以暂停)

    2021-06-09 18:02:41
  • Spring Cloud升级最新Finchley版本的所有坑

    2021-09-02 07:21:51
  • 在C#中根据HardwareID获取驱动程序信息的实现代码

    2023-08-04 08:15:31
  • SpringBoot使用validation做参数校验说明

    2022-04-24 09:18:03
  • VS2019配置opencv详细图文教程和测试代码的实现

    2023-07-17 13:49:31
  • asp之家 软件编程 m.aspxhome.com