【问题标题】:Java CDI and private constructorsJava CDI 和私有构造函数
【发布时间】:2017-03-28 16:16:33
【问题描述】:

我有一个单例类,它有一个私有默认构造函数和一个公共实例获取器,如下所示:

public class MyClass {
    private static MyClass INSTANCE = new MyClass();

    private MyClass() {}

    public static MyClass getInstance() {
        return INSTANCE;
    }
}

有没有办法使用 CDI 为这个类启用依赖注入,同时告诉容器使用从 getInstance() 方法返回的值?并非每个访问该类的应用程序都将位于 servlet 容器中,因此在这些情况下仍需要使用实例获取方法。

【问题讨论】:

  • 你使用 Spring 吗?
  • 不在此应用中
  • 什么时候得到@Model注解(库)?
  • 创建一个带有@Named注解的bean,具有MyClass getMyClass() { return MyClass.INSTANCE; }方法

标签: java dependency-injection singleton


【解决方案1】:

我想你想使用 CDI。请尝试以下操作:

@ApplicationScoped 
@Named //necessary only if you want to refer to by name binding on JSF
public class MyClass {
    @PostConstruct
    public void afterCreate() {
        System.out.println("Object created");
    }
} 

这样,您将拥有一个用于整个应用程序的 @Inject 可 CDI bean。基本上是一个免费的单身人士。

【讨论】:

    【解决方案2】:

    你也可以使用生产者

    @Produces @ApplicationScoped
    private static MyClass INSTANCE = new MyClass();
    

    然后当你 @Inject MyClass myClass 时它可以作为一个 bean 使用,但你真的应该将它切换为一个完全托管的 bean。

    【讨论】:

      【解决方案3】:

      CDI 中有一个@Singleton 构造型。使用它,而不是通过生产者或任何其他方式模拟这种行为。

      @Named
      @Singleton
      public class MyClass {
      @Inject
      private Foo injectedFoo;
      
      }
      

      完成!不需要其他任何东西。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-08
        • 2016-02-21
        • 1970-01-01
        • 2022-12-04
        • 2011-04-20
        • 2011-04-02
        相关资源
        最近更新 更多