По умолчанию в springboot, когда мы объявляем метод с @Bean, экземпляр объекта будет общим для всех объектов, которые запрашивают @Autowired этого класса...
Что, если я хочу, чтобы Spring доставлял разные экземпляры для каждого класса autowire, запрашивающего этот объект?
Я имею в виду, что вместо того, чтобы делиться одним экземпляром компонента, нужно иметь несколько «одноразовых» компонентов для каждой заявки на этот объект?
Почему я этого хочу?
причина довольно проста, RestTemplateBuilder — это обычный bean-компонент, используемый в большинстве приложений Spring, по своей природе этот строитель является STATEFUL, что означает, что любые изменения, внесенные в один класс в его структуру, вызовут побочные эффекты для всех других объектов, которые его используют.
Если вы хотите иметь другой экземпляр для каждого класса, который вы вводите, вы должны использовать аннотацию области следующим образом:
@Bean
@Scope("prototype")
public Person personPrototype() {
return new Person();
}
вы также можете использовать константу следующим образом:
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
Это не состояние, так как построитель для каждого вызова метода возвращает новый
RestTemplateBuilder
вместо изменения внутреннего состояния. Поэтому, если вам нужно несколько разныхRestTemplate
, вы можете настроить его по умолчанию и для каждогоRestTemplate
просто вызвать цепочку методов и создать ее.