bean java spring javabeans destroy

java - bean - @postconstruct



¿Cuándo se llama un método de destruir los frijoles de primavera? (6)

El "método de destruir" solo se llama si y solo si el bean es una instancia de singleton

Ver la salida de registro del contenedor IOC

INFO: Destruyendo singletons en org.springframework.beans.factory.support.DefaultListableBeanFactory@1a0ce4c: definiendo beans [libro1]; raíz de la jerarquía de fábrica

He puesto una declaración de sysout en el "método de destrucción" para un bean. Cuando ejecuto un código de muestra, el sysout no está obteniendo salida. ¿Eso significa que el método de destrucción no es llamado?

La clase de prueba:

package spring.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class InitTest { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("InitTestContext.xml"); InitTestBean bean = (InitTestBean)ctx.getBean("InitTestBean"); bean.display(); } }

El frijol

package spring.test; public class InitTestBean { private String prop1; private String prop2; public InitTestBean(String prop1, String prop2) { System.out.println("Instantiating InitTestBean"); this.prop1 = prop1; this.prop2 = prop2; } public void setProp1(String prop1) { System.out.println("In setProp1"); this.prop1 = prop1; } public void setProp2(String prop2) { System.out.println("In setProp2"); this.prop2 = prop2; } public String getProp1() { return prop1; } public String getProp2() { return prop2; } public void display() { System.out.println("Prop1 is " + prop1); System.out.println("Prop2 is " + prop2); } public void initialize(){ System.out.println("In initialize"); this.prop1 = "init-prop1"; this.prop2 = "init-prop2"; } public void teardown() { System.out.println("In teardown"); this.prop1 = null; this.prop2 = null; } }

El archivo de configuración:

<?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:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="InitTestBean" class="spring.test.InitTestBean" init-method="initialize" destroy-method="teardown"> <constructor-arg value="Prop1" /> <constructor-arg value="Prop2" /> <property name="prop1" value="setProp1"/> <property name="prop2" value="setProp2"/> </bean> </beans>


Hola, necesita cambiar ApplicationContext a AbstractApplicationContext y luego registrarse en un ShutDownhook que destruirá su bean y también implementará la interfaz de DisposableBean, por ejemplo:

package spring.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.context.support.AbstractApplicationContext; public class InitTest { public static void main(String[] args) { AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("InitTestContext.xml"); ctx.registerShutdownHook(); InitTestBean bean = (InitTestBean)ctx.getBean("InitTestBean"); bean.display(); } }

y ahora implemente la interfaz DisposableBean

package spring.test; import org.springframework.beans.factory.DisposableBean; public class InitTestBean implements DisposableBean{ private String prop1; private String prop2; public InitTestBean(String prop1, String prop2) { System.out.println("Instantiating InitTestBean"); this.prop1 = prop1; this.prop2 = prop2; } public void setProp1(String prop1) { System.out.println("In setProp1"); this.prop1 = prop1; } public void setProp2(String prop2) { System.out.println("In setProp2"); this.prop2 = prop2; } public String getProp1() { return prop1; } public String getProp2() { return prop2; } public void display() { System.out.println("Prop1 is " + prop1); System.out.println("Prop2 is " + prop2); } public void initialize(){ System.out.println("In initialize"); this.prop1 = "init-prop1"; this.prop2 = "init-prop2"; } public void teardown() { System.out.println("In teardown"); this.prop1 = null; this.prop2 = null; } @Override public void destroy() throws Exception { System.out.println(" the bean has been destroyed"); } }


Puede ser demasiado tarde para el OP, pero si alguien todavía lo está buscando ...

El método close se encuentra en AbstractApplicationContext y no en ApplicationContext , también otra forma es usar ctx.registerShutdownHook() instead of ctx.close() por razones obvias de que al ejecutar Junit s puede que desee cerrar el contexto, pero no mientras esté en el entorno de producción. Deje que Spring decida cuándo cerrarlo.


Su ejemplo no funciona porque no está cerrando el appcontext, simplemente está dejando que el programa termine.

Llame a close() en el contexto, y verá cómo se llama a los métodos de destrucción de beans.


factory.destroySingletons(); después de su bean.display() como destroy-method se valora en la definición de bean. El ámbito predeterminado con el que se crea el bean es singleton, por lo tanto, invocar factory.destroySingletons() llamará al método mencionado en el destroy-method .


//Getting application context ApplicationContext context = new ClassPathXmlApplicationContext(beansXML); //cleaning context ((ClassPathXmlApplicationContext) context).close();