Spring: создайте новый экземпляр bean-компонента для каждого вызова метода get - PullRequest
16 голосов
/ 10 августа 2011

У меня следующая ситуация: Connection manager должен иметь каждый раз один объект ConnectionServer и новые объекты DataBean Итак, я создал эти bean-компоненты и настроил их весной xml.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <bean id="dataBena" class="com.test.DataBean" scope="prototype"/>
    <bean id="servCon" class="com.test.ServerCon"/>
    <!--<bean id="test" class="com.test.Test"/>-->
     <context:component-scan base-package="com.test"/>
</beans>

и добавленная область действия prototype для DataBean

После этого я создал простой класс util / component под названием Test

@Component
public class Test {

    @Autowired
    private DataBean bean;
    @Autowired
    private ServerCon server;

    public DataBean getBean() {
        return bean.clone();
    }

    public ServerCon getServer() {
        return server;
    }

}

НО, каждый раз при вызове метода getBean () я клонирую этот боб, и это проблема для меня. Можно ли сделать это из конфигурации пружины без использования метода клонирования ? Благодарю.

1 Ответ

33 голосов
/ 10 августа 2011

Вы ищете метод поиска функциональность в Spring.Идея состоит в том, что вы предоставляете абстрактный метод, подобный этому:

@Component
public abstract class Test {
  public abstract DataBean getBean();
}

и говорите Spring, что он должен реализовать его во время выполнения:

<bean id="test" class="com.test.Test">
  <lookup-method name="getBean" bean="dataBean"/>
</bean>

Теперь каждый раз, когда вы вызываете Test.getBean, вына самом деле вызовет Spring-сгенерированный метод.Этот метод запросит ApplicationContext экземпляр DataBean.Если этот бин prototype -области, вы будете получать новый экземпляр каждый раз, когда вы вызываете его.

Я писал об этой функции здесь .

...