Spring: создать новый экземпляр bean для каждого вызова метода get
У меня следующая ситуация:
Connection manager
должен иметь каждый раз один объект ConnectionServer
и новые объекты DataBean
Итак, я создал эти beans и настроил его spring 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() я клонирую этот bean, и это проблема для меня.
Могу ли я сделать это из spring конфигурации без использования метода клонирования?
Благодарю.
Ответы
Ответ 1
Вы ищете метод поиска в 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
. Если этот bean prototype
-scoped, вы получите новый экземпляр каждый раз, когда вы его назовете.
Я написал об этой функции здесь.