language/java
Resouce leak: 'applicationContext' is never closed
아르르르를를르
2022. 1. 27. 19:16
자바 스프링 공부를 하다 다음과 같이 ApplicationContext를 사용할 때 resource leak 오류를 볼 수 있다.
스프링 컨테이너가 중지되면 암시적으로 닫히므로 실행되는데는 문제가 없지만 warning으로 뜨는 것이 꽤 신경쓰여 한번 알아보았다.
- ApplicationContext란?
해당 어플리케이션에 대한 구성정보를 제공하는 인터페이스이다. 객체를 생성하고 스프링 컨테이너를 초기화하기 위해 Bean들을 불러오는데 BeanFactory interface를 상속 받은 인터페이스이다.
BeanFactory와의 차이점이라면 BeanFactory는 lazy-loading 방식인데 반해 ApplicationContext는 pre-loading 방식으로 더 좋은 성능을 보인다.
아래가 내가 작성한 코드 예시이다.
public static void main(String[] args) {
// BeanFactory xmlFactory = new ClassPathXmlApplicationContext("config.xml"); // 에러 발생
ApplicationContext xmlFactory = new ClassPathXmlApplicationContext("config.xml");
String hello = xmlFactory.getBean("hello", String.class);
System.out.println(hello);
여기서 '아 close하면 되겠네' 하고 단순히 xmlFactory.close()를 추가하면 해당 메소드가 없다고 나온다.
The method close() is undefined for the type ApplicationContext
다음 코드처럼 형변환 Downcast 시켜줘야 해결된다. ApplicationContext 에는 close method가 없다. AbstractApplicationContext에 구현되어 있는 close method를 사용하게 된다.
((ClassPathXmlApplicationContext) xmlFactory).close(); // 추가로 해결한 코드
문제 해결@@!
참고: https://stackoverflow.com/questions/14423980/how-to-close-a-spring-applicationcontext