En una aplicación de Spring MVC, inicializo una variable en una de las clases de servicio usando el siguiente enfoque:
ApplicationContext context =
new ClassPathXmlApplicationContext("META-INF/userLibrary.xml");
service = context.getBean(UserLibrary.class);
UserLibrary es una utilidad de terceros que estoy usando en mi aplicación. El código anterior genera una advertencia para la variable 'contexto'. La advertencia se muestra a continuación:
Resource leak: 'context' is never closed
No entiendo la advertencia. Como la aplicación es una aplicación Spring MVC, realmente no puedo cerrar / destruir el contexto ya que me refiero al servicio mientras la aplicación se está ejecutando. ¿Qué es exactamente lo que intenta decirme la advertencia?
java
eclipse
spring
spring-mvc
ziggy
fuente
fuente
Respuestas:
Dado que el contexto de la aplicación es un
ResourceLoader
(es decir, operaciones de E / S), consume recursos que deben liberarse en algún momento. También es una extensión de loAbstractApplicationContext
que implementaClosable
. Por lo tanto, tiene unclose()
método y se puede usar en una declaración try-with-resources .Si realmente necesitas crear este contexto es una pregunta diferente (te vinculaste a él), no voy a comentar sobre eso.
Es cierto que el contexto se cierra implícitamente cuando se detiene la aplicación, pero eso no es lo suficientemente bueno. Eclipse tiene razón, debe tomar medidas para cerrarlo manualmente en otros casos para evitar fugas del cargador de clases.
fuente
ApplicationContext
interfaz base no proporciona elclose()
método,ConfigurableApplicationContext
(quéClassPathXmlApplicationContext
implementa) lo hace y se extiendeCloseable
hasta el inicio, por lo que puede usar el paradigma de prueba con recursos de Java 7.ApplicationContext
y rascándome la cabeza sobre por qué recibía la advertencia cuando no parecía haber un método cercano disponible ...close()
no está definido en laApplicationContext
interfaz.La única forma de deshacerse de la advertencia de forma segura es la siguiente
O, en Java 7
La diferencia básica es que dado que crea una instancia del contexto explícitamente (es decir, mediante el uso de
new
), conoce la clase que está instanciando, por lo que puede definir su variable en consecuencia.Si no estaba creando una instancia de AppContext (es decir, usando el proporcionado por Spring), entonces no podría cerrarlo.
fuente
new ClassPathXmlApplicationContext(...);
Debe estar fuera del bloque de intentos. Entonces no es necesario realizar la verificación nula. Si el constructor lanza una excepción, entoncesctx
es nulo yfinally
no se llama al bloque (porque la excepción se lanzó fuera del bloque try). Si el constructor no lanzó una excepción, entoncestry
se ingresa el bloque yctx
no puede ser nulo, por lo que no hay necesidad de una verificación nula.Un elenco simple resuelve el problema:
fuente
Como el contexto de la aplicación tiene una instancia de ClassPathXmlApplicationContext y el mismo tiene un método close (). Simplemente lanzaría el objeto appContext e invocaría el método close () como se muestra a continuación.
Esto solucionará la advertencia de fuga de recursos.
fuente
prueba esto. debe aplicar cast para cerrar el contexto de la aplicación.
fuente
Incluso tuve exactamente la misma advertencia, todo lo que hice fue declarar
ApplicationContext
fuera de la función principal comoprivate static
y ta-da, problema solucionado.fuente
@SupressWarnings
anotación, pero aún mejor para resolver el problema de raíz, ¿no crees?La transmisión es la solución correcta para este problema. Enfrenté el mismo problema usando la siguiente línea.
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
Para resolver la advertencia, simplemente baje el
ctx
objeto como se muestra a continuación y luego ciérrelo.((AnnotationConfigApplicationContext) ctx).close();
fuente
Reduzca el contexto a ConfigurableApplicationContext.
fuente
((ConfigurableApplicationContext)(context)).close();
puede ser que esta sea la respuesta correctaEn mi caso la fuga desaparece
fuente
Esto funcionó mejor para mí.
fuente
Si está utilizando ClassPathXmlApplicationContext , puede utilizar
para cerrar el problema de la fuga de recursos.
Si está utilizando AbstractApplicationContext , puede convertir esto con el método close.
Depende del tipo de contexto que se utilice en la aplicación.
fuente
fuente
Convierte el contexto en una variable estática, lo que significa que el contexto está disponible para todos los métodos estáticos de la clase y ya no está limitado al alcance del método principal. Por lo tanto, la herramienta ya no puede asumir que debería cerrarse al final del método, por lo que ya no emite la advertencia.
fuente
Sí, la interfaz
ApplicationContext
no tieneclose()
método, así que me gusta usar classAbstractApplicationContext
para usar eseclose
método explícitamente y también aquí puede usar su clase de configuración de la aplicación Spring usando anotación en lugar deXML
tipo.tu
Resource leak: 'context' is never closed
advertencia se ha ido ahora.fuente
tiene una solución simple, simplemente ingrese el jar del núcleo en las bibliotecas, que se proporciona en este enlace [descargar los archivos del jar del núcleo para Spring] [1] [1]: https://static.javatpoint.com/src/sp/spcorejars. Código Postal
fuente
El método close se ha agregado a la interfaz ConfigurableApplicationContext, por lo que lo mejor que puede hacer para acceder a él es:
fuente