如何将托管 bean(非静态)注入静态方法?
How to Inject a managed bean(non-static) into static method?
我正在为 bean 生命周期使用 Java CDI。
@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) Managed bean注入静态方法,它显示compaliaton错误
Cannot make a static reference to the non-static field
managedBeanClass
陷入上下文 DI 和静态对象生命周期。
提前帮我解决这个问题。
您的示例代码中的问题与CDI无关;您正在尝试从静态方法访问非静态字段 (managedBeanClass
)。这在 Java 中是不可能的(无论有没有 CDI)。
此外,静态方法几乎总是指向设计问题 (*)。拥有这样的静态方法会使您的程序更难测试并且更难更改/维护。尝试想出一个完全不需要静态方法的设计...
所以,简短的回答是:不要。
但是如果你真的必须在这里有一个静态方法,你可以使用构造函数注入并从构造函数中设置一个static字段。 但要小心:这有潜在的危险,因为每个新实例都会再次设置该字段(这可能导致竞争条件和意外行为)。
(另请参阅:)
(*) 除了少数例外,例如数学 class 中的方法。但这些都是非常小的纯函数,没有副作用。
我正在为 bean 生命周期使用 Java CDI。
@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) Managed bean注入静态方法,它显示compaliaton错误
Cannot make a static reference to the non-static field managedBeanClass
陷入上下文 DI 和静态对象生命周期。 提前帮我解决这个问题。
您的示例代码中的问题与CDI无关;您正在尝试从静态方法访问非静态字段 (managedBeanClass
)。这在 Java 中是不可能的(无论有没有 CDI)。
此外,静态方法几乎总是指向设计问题 (*)。拥有这样的静态方法会使您的程序更难测试并且更难更改/维护。尝试想出一个完全不需要静态方法的设计...
所以,简短的回答是:不要。
但是如果你真的必须在这里有一个静态方法,你可以使用构造函数注入并从构造函数中设置一个static字段。 但要小心:这有潜在的危险,因为每个新实例都会再次设置该字段(这可能导致竞争条件和意外行为)。
(另请参阅:)
(*) 除了少数例外,例如数学 class 中的方法。但这些都是非常小的纯函数,没有副作用。