Ответ 1
Прежде чем применять аннотацию @Lookup
к вашему методу public MyClass2 myClass2()
, прочитайте это в @Lookup Javadoc:
контейнер будет генерировать подклассы времени выполнения метода, содержащего класс через CGLIB, поэтому методы поиска могут работать только на beans, которые контейнер создает через регулярные конструкторы (т.е. методы поиска не могут быть заменены на beans возвращается из factory методов, где мы не можем динамически предоставлять подкласс для них).
Итак, удалите следующий factory метод style bean из ApplicationConfiguration
:
@Bean
public MyClass1 myClass1() {
return new ContentHolderTabPaneController();
}
и добавьте аннотацию @Component
, чтобы Spring создать экземпляр bean (также добавьте аннотацию @Lookup
к методу):
@Component
public class MyClass1 {
doSomething() {
myClass2();
}
//I want this method to return MyClass2 prototype
@Lookup
public MyClass2 myClass2(){
return null; // This implementation will be overridden by dynamically generated subclass
}
}
Теперь получим myClass1
bean вне контекста, и его метод myClass2
должен быть заменен/переопределен для получения нового прототипа bean каждый раз.
Update:
Использование объявления метода factory
Не сложно реализовать аннотированный метод @Lookup
( "метод поиска" ). Без @Lookup
и сохраняя ваш класс конфигурации без изменений, теперь выглядит myClass1
(фактически Spring создает аналогичную реализацию в подклассе, если @Lookup
):
public class MyClass1 {
doSomething() {
myClass2();
}
//I want this method to return MyClass2 prototype
@Autowired
private ApplicationContext applicationContext;
public MyClass2 myClass2() {
return applicationContext.getBean(MyClass2.class);
}
}
Spring вводит ApplicationContext
для вас.