致访客
感谢各位一年多的陪伴,因内容调整,本站将于近日迁移到新域名并不再更新主要内容。

MENU

Java静态方法调用@Autowired/@Resource注入的对象

• November 8, 2021 • Java,SpringBoot

致访客
感谢各位一年多的陪伴,因内容调整,本站将于近日迁移到新域名并不再更新主要内容。
特此通知。

概述

项目中一个工具类需要调用UserService中的业务,但静态方法中不能调用非静态方法,否则编译不通过;而给被注入的对象添加static关键字会导致无法注入,值为null

问题源码

public class TestUtils {

    @Resource
    private UserService userService;

    public static void testMethod(Integer userId) {
        // 编译不通过
        userService.deleteByUserId(userId);
    }
}
public class TestUtils {

    // 编译通过但userService值为null
    @Resource
    private static UserService userService;

    public static void testMethod(Integer userId) {
        userService.deleteByUserId(userId);
    }
}

解决方案

使用Java关键字@PostConstruct进行初始化
具体步骤如下:

  1. 将该类交给Spring容器管理
  2. 注入对象
  3. 声明一个类自身的静态成员变量
  4. 初始化静态成员变量
  5. 调用该成员变量

代码如下:

// @Component注解务必要添加
@Component
public class TestUtils {
    // 正常注入Service
    @Resource
    private UserService userService;
    
    // 声明类自身的静态成员变量
    public static TestUtils testUtils;

    // 初始化静态成员变量
    @PostConstruct
    public void init(){
        testUtils = this;
        testUtils.userService = this.userService;
    }

    public static void testMethod(Integer userId) {
        // 调用该成员变量中的
        testUtils.userService.deleteByUserId(userId);
    }
}