Как заставить пружинный контейнер не возвращать единичный экземпляр компонента? - PullRequest
18 голосов
/ 14 января 2009

Когда я вызываю getBean(name) на BeanFactory, я получаю обратно экземпляр компонента, определенный в контексте приложения. Однако, когда я снова вызываю getBean(name) (с тем же именем,), я получаю тот же экземпляр компонента. Я понимаю, как это было бы желательно в некоторых (многих?) Случаях, но как мне сказать BeanFactory, чтобы дать мне новый экземпляр?

Пример конфигурации Spring (кратко ... Я пропустил некоторые подробности, но это должно понять смысл):

<beans>
   <bean id="beanA" class="misc.BeanClass"/>
</beans>

Пример Java:

for(int i = 0;i++;i<=1) {
    ApplicationContext context = ClassPathXmlApplicationContext("context.xml");
    Object o = context.getBean("beanA");

    System.out.println(o.toString());  // Note: misc.BeanA does not implement 
                                       // toString(), so this will display the OOID
                                       // so that we can tell if it's the same
                                       // instance
}

Когда я запускаю это, я получаю что-то вроде:

misc.BeanClass@139894
misc.BeanClass@139894

Обратите внимание, что оба имеют одинаковый OOID ... так что это одни и те же экземпляры ... но я хотел разные экземпляры.

Ответы [ 2 ]

33 голосов
/ 14 января 2009

Вы должны сказать Spring, что вам нужен прототип, а не синглтон

<bean id="beanA" class="misc.BeanClass" scope="prototype"/>

Это даст вам новый экземпляр с каждым запросом.

14 голосов
/ 14 января 2009

Значение по умолчанию scope - одноэлементное, но вы можете установить его для прототипа, запроса, сеанса или глобального сеанса.

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