- 现象:
@Autowired
private static RedisService redisService;
会报错,对象无法注入
-
原因:
静态成员是属于类的,当类加载器加载静态变量时,Spring上下文尚未加载。所以类加载器不会在bean中正确注入静态类,并且会失败,不建议这样使用。
-
解决方法:
-
使用@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(); } }
另外,需要在项目启动时只加载一次,用静态代码块中用到需要@Autowire注入的对象,可修改为使用@PostConstruct注解定义一个初始化的方法来代替静态代码块,这样注入的对象就不必为static的。
-
将@Autowire加到构造方法上(未验证是否可行)
@Component public class Test { private static UserService userService; @Autowired public Test(UserService userService) { Test.userService = userService; } public static void test() { userService.test(); } }
-