概述
@Resource
注解用于依赖注入,但在静态字段上使用时会引发“@Resource annotation is not supported on static fields
”异常。这是因为依赖注入通常是与实例相关的,而静态字段属于类本身,而非特定的实例。
异常详细描述
- 原因:
@Resource
注解是由 Spring 或 Java EE 等容器进行处理的,容器在创建对象时会解析这些注解并注入依赖。静态字段在类加载时就会被初始化,而不依赖于对象实例,因此容器无法对其进行注入。
解决方案
1、使用
实例字段: 将静态字段改为实例字段,然后使用 @Resource
进行注入。
public class MyClass {
@Resource
private MyService myService; // 改为实例字段
}
2、使用 @PostConstruct
方法: 如果确实需要使用静态字段,可以在实例字段中注入依赖,然后在 @PostConstruct
注解的方法中将其赋值给静态字段。
public class MyClass {
private static MyService myServiceStatic;
@Resource
private MyService myService;
@PostConstruct
public void init() {
myServiceStatic = myService;
}
}
3、使用 Spring 的 @Autowired
注解: 在 Spring 中,推荐使用 @Autowired
注解来进行依赖注入,同样适用上述两种方式。
public class MyClass {
@Autowired
private MyService myService; // 实例字段
}
结论
避免在静态字段上使用 @Resource
注解,而是应该选择实例字段进行注入,或者通过实例字段在方法中进行赋值。这样可以确保依赖注入的正确性和容器的正常工作。