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



我在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(托管bean注入静态方法,它显示了压缩错误

无法对非静态字段进行静态引用managedBeanClass

陷入上下文DI和静态对象生命周期的困境。请提前帮我解决这个问题。

示例代码中的问题与CDI无关;您正试图从静态方法访问非静态字段(managedBeanClass(。这在Java中是不可能的(无论有没有CDI(。

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

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

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

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

(*(除了一些例外,比如Math类中的方法。但这些都是非常小的、纯粹的功能,没有副作用。

最新更新