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

标签 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();
           ....
      }

}

尝试将托管bean注入(inject)(@Inject)静态方法,它显示comaliaton错误

Cannot make a static reference to the non-static field managedBeanClass

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

最佳答案

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

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

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

但是,如果您确实必须在这里有一个静态方法,则可以使用构造函数注入(inject)并从构造函数设置一个静态字段。 但要注意:这有潜在的危险,因为每个新实例都会再次设置字段(这可能会导致竞争条件和意外行为)。

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

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

关于java - 如何将托管bean(非静态)注入(inject)静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53084716/

相关文章:

java - 如何防止在Spring Boot单元测试中执行import.sql

java - Spring JPA @ManyToOne 保存因重复 key 而失败

python - 将 Python 模块作为参数传递是一个好习惯吗

java - 尝试注入(inject)两个具有通用实现的存储库失败

java - 我可以编译依赖于 .class 文件的 java 代码,但我没有源 .java 文件吗?

java - 为什么我不能强制 EditTextPreference 只取数字?

java - Storm 拓扑的 bolt 接收重复结果

java - SpringApplication.run() 方法完成之前有很大的延迟

android - Dagger 2 混合瞄准镜

java - 避免在涉及类的运行时传递的一般情况下进行不安全转换