Spring прототип bean с параметром - как всегда получать один и тот же bean-компонент при задании одного и того же параметра? - PullRequest
0 голосов
/ 06 июня 2019

При использовании @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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...