你可以将@Autowired与静态字段一起使用吗?

129 java spring

有没有办法用于@Autowired静态字段.如果没有,是否有其他方法可以做到这一点?

ska*_*man 110

简而言之,没有.您无法在Spring中自动装配或手动连​​接静态字段.你必须编写自己的逻辑才能做到这一点.

  • 你可以找到更多更新[在这里回答](http://stackoverflow.com/a/17660550) (3认同)
  • 当您发现旧代码执行此操作时,它是一种反模式.斜视,倾斜你的头,找到更好的方法来解决问题.你会很高兴的. (2认同)
  • 这个[answer](http://stackoverflow.com/a/3746611/409976)对Spring的@AutoWired也很有帮助。 (2认同)

Sed*_*şar 99

@Component("NewClass")
public class NewClass{
    private static SomeThing someThing;

    @Autowired
    public void setSomeThing(SomeThing someThing){
        NewClass.someThing = someThing;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 缺点:如果静态访问,则无法保证 `someThing` 已被初始化:`NewClass.staticMethodWhichUsesSomething();` 如果在应用程序初始化之前使用,则可能会抛出 NPE (4认同)

vic*_*ugo 66

@Autowired 可以与setter一起使用,这样你就可以让setter修改静态字段.

只有一个最后的建议...... 不要

  • 你为什么建议不这样做? (49认同)
  • 是的,我也有兴趣知道为什么不建议这样做...... (9认同)
  • 嗯..我对于为什么不推荐它的感觉是,因为那时类中的静态实例超出了spring的控制范围.一旦注入,静态字段就是对应(周围)类的所有对象实例的_the_ reference.但是,这种行为可能正是预期会发生的事情,因此可能被视为错误或特征...... (3认同)
  • 是的@matthaeus,这正是我在需要访问 org.springframework.core.env.Environment 时所期望的功能:`@Component public class SpringAppEnv{ public static Environment _env; @Autowired public void setEnv(环境 env) {_env = env;} }` (2认同)

ak-*_*k-j 8

在@PostConstruct方法中初始化自动装配的组件

@Component
public class TestClass {
   private static AutowiredTypeComponent component;

   @Autowired
   private AutowiredTypeComponent autowiredComponent;

   @PostConstruct
   private void init() {
      component = this.autowiredComponent;
   }

   public static void testMethod() {
      component.callTestMethod();
   }
}
Run Code Online (Sandbox Code Playgroud)


Jhe*_*ico 5

创建一个可以自动装配的bean,它将静态变量初始化为副作用.


use*_*900 5

想要添加自动接线静态字段(或常量)将被忽略的答案,但也不会产生任何错误:

@Autowired
private static String staticField = "staticValue";
Run Code Online (Sandbox Code Playgroud)