2016-11-14 4 views
0

У меня есть класс одноплодного, который имеет приватный конструктор по умолчанию и общедоступный экземпляр-поглотитель, как следующим образом:Java CDI и частные Конструкторы

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

    private MyClass() {} 

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

Есть ли способ использовать CDI для того, чтобы инъекций зависимостей для этого класса, но также сообщить контейнеру использовать значение, возвращаемое методом getInstance()? Не каждое приложение, получающее доступ к классу, будет находиться в контейнере сервлетов, поэтому метод экземпляра-получателя по-прежнему будет использоваться в этих ситуациях.

+0

Вы используете Spring? –

+0

Не на этом приложении – Nixx

+0

Когда вы получаете аннотацию @Model (библиотека)? –

ответ

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"); 
    } 
} 

Таким образом, у вас будет один компонент, который может быть использован для всех приложений. По сути, Singleton бесплатно.

0

Вы можете использовать продюсер, а

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

Тогда ее доступный как боб, когда вы @Inject MyClass myClass, но вы действительно должны включить его, чтобы быть полноценным управляемым компонентом.

0

В CDI имеется стереотип @Singleton. Используйте это, вместо того, чтобы подражать этому поведению с производителями или любыми другими способами.

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

} 

Done! Больше ничего не нужно.

Смежные вопросы