如何将托管bean(非静态)注入静态方法?

时间:2018-10-31 13:36:40

标签: java spring dependency-injection cdi static-methods

我将Java CDI用于bean生命周期。

@Named
public class ManagedBeanClass{
    ...
    public ManagedProfile getManagedProfile(){
       return new ManagedProfile();//logic will goes here
    }
}

例如

public class sample1{
      @Inject private ManagedBeanClass managedBeanClass;
      ...
      public static boolean methodExample() throws Exception{
           ManagedProfile managedProfile = managedBeanClass.getManagedProfile();
           ....
      }

}

尝试将(@Inject)托管bean注入到静态方法中,它显示比较错误

  

无法静态引用非静态字段   managedBeanClass

陷入上下文DI和静态对象生命周期的困境。 提前帮助我解决此感谢。

1 个答案:

答案 0 :(得分:1)

示例代码中的问题与CDI无关;您正在尝试从静态方法访问非静态字段(managedBeanClass)。在Java中(使用CDI或不使用CDI都不可能)。

此外,静态方法几乎总是指向设计问题(*)。拥有这样的静态方法会使您的程序难以测试,也难以更改/维护。尝试提出一种根本不需要静态方法的设计...

所以,简单的答案是:不要。

但是,如果您真正的必须在此处具有静态方法,则可以使用构造函数注入,并从构造函数中设置 static 字段。 但是要小心:这具有潜在的危险,因为每个新实例都会重新设置该字段(这可能会导致比赛条件和意外行为)。

(另请参见:https://stackoverflow.com/a/22068572/10363398

(*)除少数例外,如Math类中的方法。但是这些都是很小的纯函数,没有副作用。