Определение компонента с областью действия прототип
То есть каждый раз, когда вводится новый экземпляр .В SpringBoot вы можете использовать аннотацию @Scope("prototype")
для вашего класса бинов Prototype
.
@Component
@Scope("prototype")
class Prototype {
@Autowired
private Repository repository;
private NonSpringBootManagedBean bean;
Prototype() {
// you can only modify this 'NonSpringBootManagedBean' later
// because Spring calls constructor without knowing NonSpringBootManagedBean
this.bean = new NonSpringBootManagedBean();
// do something with 'repository' because its defined
}
public void setNonSpringBootManagedBean(NonSpringBootManagedBean bean) {
this.bean = bean;
}
}
Использовать экземпляры этого бина
С помощью инъекции (например, @Autowired
в конструктор) вы можете использовать различные экземпляры этого прототипа bean-компонента в других bean-компонентах.
@Component
class PrototypeClient {
// ApplicationContext still used?
@Autowired
private ApplicationContext context;
private Prototype prototypeInstance;
@Autowired // injects the new instance of Prototype
public PrototypeClient(Prototype p)
this.prototypeInstance = p;
// here you can change the NSBMB
modifyPrototype();
}
private void modifyPrototype(NonSpringBootManagedBean bean) {
this.prototypeInstance.setNonSpringBootManagedBean( new NonSpringBootManagedBean() );
}
}
Почему выдается исключение?
no bean ofОбнаружен тип NonSpringBootManangedBean
Spring сообщает, что пытается создать экземпляр объекта типа Prototype
Prototype prototype = context.getBean(Prototype.class, bean);
, поскольку для вызова его конструктора ему необходимо передать аргумент типа NonSpringBootManagedBean
,Так как все это создание экземпляра бина выполняется внутри Spring (Boot), вы не можете перехватить и сказать Spring: «Эй, используйте этот бин класса NonSpringBootManagedBean», как вы пытались в методе createNewPrototype(NonSpringBootManagedBean bean)
.
Почему могРазве NonSpringBootManagedBean
не будет управляться как bean-компонентом Spring (Boot)?
Автоматическое подключение в SpringBoot - это способ внедрение зависимостей .Это означает, что SpringBoot ранее создавал экземпляр компонента, автоматически при запуске (при загрузке Spring).И этот боб теперь вводится как зависимость в другой бин и т. Д., Потому что этот другой бин зависит от него.
Если вы расскажете нам еще кое-что, мы могли бы пролить свет на вашу ситуацию.Это могут быть некоторые ответы на следующие вопросы:
- Что такое NonSpringBootManagedBean и почему отсутствует управляемый компонент ?
- Что такое Прототип и для каких целей он использует NonSpringBootManagedBean ?
- Что такое PrototypeClient и почему он создает свой собственный Prototype ?
Я не уверен, понял ли я связь и цель между вашими объектами / классами.