Я новичок в фреймворках внедрения. И мой вопрос сам по себе является противоречием, но - гипотетически - возможно ли, чтобы CDI вводил ровно два разных экземпляра одного и того же класса в мой код? Два синглтона одного класса так сказать? И если да, то как будут выглядеть аннотации? Создание двух разных экземпляров @Named с помощью методов @Produces?
---- изменить ----
Вот что у меня получилось:
@Singleton
public final class StartupBean {
@Inject
StartupBean(SomeManager someManager) {
// nothing happening here
}
@Produces
@Named("fooObject")
public MyImplementation produceFooObject() {
return new MyImplementation();
}
@Produces
@Named("barObject")
public MyImplementation produceBarObject() {
return new MyImplementation();
}
}
// class implementing two interfaces
final class MyImplementation
extends SomethingElse
implements MyInterface, MyOtherInterface {
}
// manager class using both named instances
@Singleton
final class SomeManager {
private final MyInterface foo;
private final MyInterface bar;
@Inject
SomeManager(
@Named("fooObject") MyInterface fooObject,
@Named("barObject") MyInterface barObject) {
this.foo = fooObject;
this.bar = barObject;
// stuff happening
}
}
// class using one of the object with different type
public final class ClassA {
private final MyOtherInterface bla;
@Inject
ClassA(@Named("fooObject") MyOtherInterface fooObject) {
this.bla = fooObject;
}
}
Но это вызывает исключение StackOverFlowError. Есть предложения?
Я новичок в фреймворках внедрения. И мой вопрос сам по себе является противоречием, но - гипотетически - возможно ли, чтобы CDI вводил ровно два разных экземпляра одного и того же класса в мой код? Два синглтона одного класса так сказать? И если да, то как будут выглядеть аннотации? Создание двух разных экземпляров @Named с помощью методов @Produces? ---- изменить ---- Вот что у меня получилось: [code]@Singleton public final class StartupBean { @Inject StartupBean(SomeManager someManager) { // nothing happening here }
@Produces @Named("fooObject") public MyImplementation produceFooObject() { return new MyImplementation(); }
@Produces @Named("barObject") public MyImplementation produceBarObject() { return new MyImplementation(); } }
// class implementing two interfaces final class MyImplementation extends SomethingElse implements MyInterface, MyOtherInterface { }
// manager class using both named instances @Singleton final class SomeManager { private final MyInterface foo; private final MyInterface bar;
// class using one of the object with different type public final class ClassA { private final MyOtherInterface bla;
@Inject ClassA(@Named("fooObject") MyOtherInterface fooObject) { this.bla = fooObject; } } [/code] Но это вызывает исключение StackOverFlowError. Есть предложения?