static类 autowired注入报null
报错解释:
static
类不能使用 @Autowired
进行依赖注入,因为 @Autowired
注解是要求 Spring 容器在创建 Bean 的时候进行注入,而 static
变量是类级别的共享变量,它们在类被加载的时候就被初始化了,而此时 Spring 容器可能还没有完成 Bean 的创建和注入。
解决方法:
-
如果你需要在
static
方法中使用依赖注入的对象,可以考虑使用非static
方法,并且在该方法中使用@Autowired
注解进行依赖注入。 -
另一种方法是使用
ApplicationContext
来手动获取 Bean 实例,但不推荐这种做法,因为它破坏了依赖注入的原则。 -
如果你需要全局访问某个 Bean,可以考虑使用
ApplicationContextAware
接口,在 Bean 创建之后,你可以通过实现ApplicationContextAware
接口的setApplicationContext
方法来获取ApplicationContext
,然后手动获取 Bean。 -
另外,你也可以创建一个非
static
的工厂类,在该工厂类中使用@Autowired
进行依赖注入,并提供一个static
方法来获取所需的 Bean 实例。
示例代码:
@Component
public class MyFactory {
private static MyDependency myDependency;
@Autowired
public void setMyDependency(MyDependency myDependency) {
MyFactory.myDependency = myDependency;
}
public static MyDependency getMyDependency() {
return myDependency;
}
}
在非 static
方法中使用依赖注入对象:
@Component
public class MyService {
@Autowired
private MyDependency myDependency;
public void doSomething() {
// 使用 myDependency
}
}
使用 ApplicationContextAware
:
@Component
public class MyApplicationContextHolder implements ApplicationContextAware {
private static ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
MyApplicationContextHolder.context = applicationContext;
}
public static <T> T getBean(Class<T> beanClass) {
return context.getBean(beanClass);
}
}
在 static
方法中使用 ApplicationContextHolder
:
public class MyUtil {
public static void doSomething() {
MyDependency myDependency = MyApplicationContextHolder.getBean(MyDependency.class);
// 使用 myDependency
}
}