Spring: Как обрабатывать прототипы bean-компонентов в контейнере Spring, одноэлементном для определенной части графа объекта? - PullRequest
0 голосов
/ 05 октября 2018

Я думаю, что это тривиальная проблема, но я не смог найти никаких обсуждений по этому поводу.
У меня есть DeeplyNestedObject, чей объектный граф должен быть автоматически подключен посредством инжекции Dependency.Внутри этого объекта граф Dependency должен иметь одноэлементную область.

 class DeeplyNestedObject {
     Dependency dependency;//should be same instance as in SomeOtherObject
     SomeOtherObject someOtherObject;

     @Autowired
     public DeeplyNestedObject(Dependency dependency,
                               SomeOtherObject someOtherObject){
          this.dependency = dependency; 
          this.someOtherObject = someOtherObject;
     }

 }

 //this is just some other class nested inside DeeplyNestedObject's object graph
 class SomeOtherObject{
     Dependency dependency;//should be same instance as in DeeplyNestedObject

     @Autowired
     public DeeplyNestedObject(Dependency dependency){
          this.dependency = dependency; 
     }

 }

Так как мне нужно только Dependency для автоматической передачи SomeOtherObject и, таким образом, DeeplyNestedObject , эта конфигурация компонентадолжно быть достаточно:

@Bean
Dependency dependency(){
     return new Dependency();
 }

У меня есть три требования, хотя

  1. DeeplyNestedObject должен быть прототипирован, поэтому я хочу каждый раз новый экземпляр этого графа объектаЯ автоматически подключаю его где-нибудь
  2. A Dependency следует рассматривать как одиночный в пределах этого графа объекта,
  3. Каждый DeeplyNestedObject должен иметьего собственный экземпляр Зависимость

Я не могу решить следующую проблему:

  • Если я прицела Зависимость в качестве прототипаЯ всегда получу новый экземпляр Dependency , нарушающий ограничение 2 (Dependency in DeeplyNestedObject и SomeOtherObject будет другим)
  • ЕслиЯ рассматриваю Dependency как Singleton, тогда я нарушуограничение 3 (каждый DeeplyNestedObject и его графы объектов будут иметь один и тот же Dependency объект)

В основном то, что мне кажется мне нужно, это ввести еще один контейнер IoCдля DeeplyNestedObject , в который я могу ввести Dependency и затем предоставить его в виде синглтона для графика DeeplyNestedObject.Тем не менее, я не видел никакого решения, как это до сих пор.

1 Ответ

0 голосов
/ 05 октября 2018

Если я определю Зависимость как прототип, я всегда получу новый экземпляр, нарушая ограничение 2

Я не думаю.Spring создает новый экземпляр для прототипа bean-объекта с областью действия только в качестве запроса на инъекцию или загрузку bean-компонента .
Так что если вы не выполняете другую загрузку / внедрение bean-компонента Dependency в DeeplyNestedObjectкак только bean-компонент DeeplyNestedObject будет добавлен в контейнер bean-компонента, вы получите отдельный экземпляр Dependency от экземпляра DeeplyNestedObject.

...