При использовании @Scope("prototype")
Spring может генерировать новый bean-компонент каждый раз, когда его запрашивают.
Также можно передать аргумент конструктора для такого bean-компонента, используя beanFactory.getBean(MyObject.class, myConstructorParam);
(как объяснено здесь).
Чего я хотел бы добиться, так это получить точно такой же экземпляр компонента, если я передал бы тот же параметр .
Например:
val bean1 = beanFactory.getBean(MyObject.class, "1")
val anotherBean1 = beanFactory.getBean(MyObject.class, "1")
val bean2 = beanFactory.getBean(MyObject.class, "2")
assertThat(bean1).isSameAs(anotherBean1)
assertThat(bean1).isNotSameAs(bean2)
Однако в приведенном выше случае первое утверждение не будет выполнено, поскольку Spring сгенерирует новый bean-компонент для anotherBean1
вместо повторного использования ранее созданного bean-компонента.
DoВы знаете, возможно ли добиться такого поведения в Spring 5?
В настоящее время мое решение заключается в реализации @Service
, который предоставляет метод get и сохраняет сгенерированные объекты вmap:
@Service
class ApiClientFactory {
private val store = mutableMapOf<Membership, ApiClient>()
fun getClient(membership: Membership): ApiClient =
store.computeIfAbsent(membership) { ApiClient(membership) }
}
Ограничение состоит в том, что он вообще не зависит от Spring, поэтому мне нужно внедрять этот сервис при необходимости, вместо того, чтобы получать бины из Spring.