java - implement - Spring: crea una nueva instancia de bean para cada método call de get
java copy object no reference (1)
Tengo la siguiente situación: el Connection manager
debe tener cada vez un objeto de ConnectionServer
y nuevos objetos de DataBean
Así que, he creado estos beans y los he configurado en primavera 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>
y añadido prototype
alcance para DataBean
Después de esto he creado una clase de utilidad / componente simple llamada Prueba
@Component
public class Test {
@Autowired
private DataBean bean;
@Autowired
private ServerCon server;
public DataBean getBean() {
return bean.clone();
}
public ServerCon getServer() {
return server;
}
}
PERO, cada vez que llamo al método getBean () estoy clonando este bean, y este es el problema para mí. ¿Puedo hacerlo desde la configuración de primavera sin utilizar el método de clonación ? Gracias.
Está buscando la funcionalidad del método de búsqueda en Spring. La idea es que proporcione un método abstracto como este:
@Component
public abstract class Test {
public abstract DataBean getBean();
}
Y dile a Spring que debería implementarlo en tiempo de ejecución:
<bean id="test" class="com.test.Test">
<lookup-method name="getBean" bean="dataBean"/>
</bean>
Ahora, cada vez que llame a Test.getBean
, en realidad llamará al método generado por Spring. Este método le pedirá a ApplicationContext
para la instancia de DataBean
. Si este bean es de prototype
, tendrá una nueva instancia cada vez que lo llame.
Escribí sobre esta característica here .