Java CDI和私有构造函数

时间:2016-11-14 22:13:34

标签: java dependency-injection singleton

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

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

    private MyClass() {}

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

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

3 个答案:

答案 0 :(得分:0)

我想你想要使用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 -able CDI bean。基本上是免费的单身人士。

答案 1 :(得分:0)

您也可以使用制作人

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

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

答案 2 :(得分:0)

CDI中有一个@Singleton刻板印象。使用此方法,而不是使用生产者或任何其他方式模拟此行为。

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

}

完成!没有别的需要。