2015-07-17 2 views
3

Я в настоящее время преобразовываю конфигурацию Spring Spring в Java аннотации, и я столкнулся с немного раздражающей ситуацией.Метод уничтожения объектов Spring register

Мне нужно создать 3 боба, которые используют один и тот же класс внутри, но должны быть отдельными экземплярами. Тем не менее, эти внутренние компоненты должны регистрировать свой метод выключения с помощью Spring.

Я не могу думать, как это сделать, не создавая 9 фасоль в Java (это хорошо, но, кажется, немного не так, чтобы быть загрязняя класс, как это)

В XML конфиг это выглядит как это:

<bean class="outer1"> 
    <constructor-arg> 
     <bean class="middle"> 
      <constructor-arg> 
       <bean class="inner" /> 
      </constructor-arg> 
     </bean> 
    </constructor-arg> 
</bean> 
<bean class="outer2"> 
    <constructor-arg> 
     <bean class="middle"> 
      <constructor-arg> 
       <bean class="inner" /> 
      </constructor-arg> 
     </bean> 
    </constructor-arg> 
</bean> 
<bean class="outer3"> 
    <constructor-arg> 
     <bean class="middle"> 
      <constructor-arg> 
       <bean class="inner" /> 
      </constructor-arg> 
     </bean> 
    </constructor-arg> 
</bean> 
+0

Вы действительно хотите, чтобы 'middle' и' inner' были beans? Если вы не просто создаете их в методе 'getXXX' – talex

+0

Почему бы просто не вызвать метод« закрытия »внутренней фасоли на зарегистрированном методе уничтожения наружных бобов? –

+0

Возможное решение здесь http://shekhargulati.com/2010/10/30/spring-scoped-proxy-beans-an-alternative-to-method-injection/ –

ответ

4

Одно из решений:

@Configuration 
public class MyConfig{ 
    @Bean(destroyMethod="cleanup") 
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) 
    public Inner inner(){ 
     return new Inner(); 
    } 


    @Bean(destroyMethod="cleanup") 
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) 
    public Middle middle(){ 
     return new Middle(inner()); 
    } 

    @Bean 
    public Outer outer1(){ 
     return new Outer(middle()); 
    } 


    @Bean 
    public Outer outer2(){ 
     return new Outer(middle()); 
    } 


    @Bean 
    public Outer outer3(){ 
     return new Outer(middle()); 
    } 
} 

От reference documentation:

Невозможный одиночный, прототип области развертывания компонента приводит к созданию нового экземпляра bean-компонента каждый раз, когда выполняется запрос для этого конкретного компонента .

Это означает, что каждый вызов метода middle() и inner() создает новый экземпляр вашего компонента.

Смежные вопросы