자바 코드 중 init method 와 destroy method 의 세 가지 사용 방식 을 자세히 설명 합 니 다.

자바 의 실제 개발 과정 에서 우 리 는 init method 와 destroy method 를 자주 사용 해 야 할 수도 있 습 니 다.예 를 들 어 대상(bean)을 초기 화 한 후에 일부 데 이 터 를 초기 화(로드)하고 대상 을 없 애기 전에 쓰레기 수 거 를 하 는 등 입 니 다.
주말 에 이 두 가지 방법 에 대해 약간의 학습 과 정 리 를 했 습 니 다.이 두 가지 방법 을 위해 서가 아니 라 spring 관련 지식 을 공 고 히 할 때 언급 했 습 니 다.그리고 자신 이 이것 에 익숙 하지 않다 는 것 을 느끼 고 잘 알 아 보 았 습 니 다.
특별히 알 아 본 결과 실제로 init method 와 destroy method 를 실현 하 는 세 가지 방법 이 있 음 을 발견 했다.
이 두 가지 방법 을 사용 하려 면 당연히 이 두 가지 방법 이 도대체 무엇 에 쓰 이 는 지 알 아야 한다.하 나 는 로드 이 고 하 나 는 소각 이다.
다음 에 정식 코드 에 대해 세 가지 생 성 방식 을 보 여 줍 니 다.
1.@Bean 주석 방식:
우선 최소한 두 가지 방법 이 있 는 클래스 를 만 들 고,한 가지 방법 은 init method 를 충당 하고,다른 하 나 는 destroy method 를 충당 해 야 한다.

package springTest2;
public class Test1 {
  public void init() {
    System.out.println("this is init method1");
  }
  public Test1() {
    super();
    System.out.println("    1");
  }
  public void destroy() {
    System.out.println("this is destroy method1");
  }
}
여 기 는 일반적인 자바 류 일 뿐 무 삼 구조 와 다른 두 가지 방법 을 가지 고 있 음 이 분명 하 다.
주의해 야 할 것 은 이곳 의 init 와 destroy 두 가지 방법 명 은 실제로 마음대로 얻 을 수 있 습 니 다.이것 이 라 고 부 르 지 않 아 도 문제 가 없습니다.단지 약속 이 라 고 할 수 있 습 니 다.보통 이렇게 부 릅 니 다.
또한 우 리 는 이 구조 방법 도 받 지 않 아 도 된다 는 것 을 알 고 있 습 니 다.암시 적 으로 자동 으로 생 성 되 기 때 문 입 니 다.그러나 init 와 destroy 가 언제 실행 되 는 지 더 잘 보기 위해 서 우 리 는 표 시 된 것 을 씁 니 다.
이 종 류 를 만 들 면@Bean 주해 방식 으로 두 가지 방법 을 지정 하여 효력 을 발생 시 킬 수 있 습 니 다.

package springTest2;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("springTest2")
public class ConfigTest {
  @Bean(initMethod = "init", destroyMethod = "destroy")
  Test1 test1() {
    return new Test1();
  }
}
이 옆 에 있 는@Configuration 주 해 는 spring 과 같은 설정 클래스 입 니 다.xml 파일 에 해당 합 니 다.@ComponentScan 은 spring 이 스 캔 해 야 할 가방 을 지정 합 니 다.xml 의 context:component-scan 속성 에 해당 합 니 다.
@Bean 뒤에 있 는 initMethod 와 destroy Method 는 이것 이 baen 이 라 고 밝 히 는 동시에 init 와 destroy 방법 을 지정 하 였 으 며,방법 명 은 기능 실현 에 있어 서 마음대로 사용 할 수 있 습 니 다.
여기까지 우 리 는 이미 첫 번 째 방식 으로 썼 습 니 다.성공 여 부 를 검증 하기 위해 main 방법 을 써 서 검증 합 니 다.

package springTest2;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MainTest {
  public static void main(String[] args) {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConfigTest.class);
        System.out.println("#################################");
    context.close();
  }
}
실행 후 결 과 는 그림 과 같 습 니 다:
 
인쇄 순서에 따라 볼 수 있 듯 이 먼저 구조 함수,즉 bean 을 만 들 었 고 이 어 init 를 실행 한 다음 에 context.close 가 bean 을 없 애기 전에 destroy 를 실 행 했 습 니 다.
2.JSR-250 주해 방식(jsr 250-api 의 jar 패 키 지 를 가 져 와 야 합 니 다):
우선 구조 방법 을 포함 한 세 가지 방법 을 가 진 자바 류 를 만 듭 니 다.

package springTest2;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class Test2 {
  @PostConstruct
  public void init() {
    System.out.println("this is init method2");
  }
  public Test2() {
    super();
    System.out.println("    2");
  }
  @PreDestroy
  public void destroy() {
    System.out.println("this is destroy method2");
  }
}
분명 한 것 은 이전 클래스 와 달리 init 와 destroy 방법 에 두 개의 주 해 를 넣 었 습 니 다.@PostConstruct 는 위@Bean 후의 initMethod 와 같 고@PreDestroy 는 destroy Method 와 같 습 니 다.
여기 서 차이 가 생 겼 으 니 init method 와 destroy method 를 지정 하 였 습 니 다.그러면 나중에 bean 을 설명 할 때 도 자 연 스 럽 게 다 를 수 있 습 니 다.다시 지정 할 필요 가 없습니다.

package springTest2;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("springTest2")
public class ConfigTest {
  @Bean
  Test2 test2() {
    return new Test2();
  }
}
따라서 상기 코드 에서 간단 한 성명 만 있 으 면 됩 니 다.이것 은 bean 이면 됩 니 다.위의 두 주 해 는 이전 예 에서 의 뜻 과 같 습 니 다.
다시 한 번 테스트 해 보 자:

package springTest2;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MainTest {
  public static void main(String[] args) {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConfigTest.class);
        System.out.println("#################################");
    context.close();
  }
}
결 과 는 다음 과 같다.

3.xml 설정 방식:
이러한 방식 은 실제 적 으로 첫 번 째 와 대응 하 는 것 입 니 다.단지 세부 적 으로 약간 바 뀌 었 을 뿐 입 니 다.우선,만 든 자바 류 는 완전히 같 습 니 다.

package springTest2;
public class Test3 {
  public void init() {
    System.out.println("this is init method3");
  }
  public Test3() {
    super();
    System.out.println("    3");
  }
  public void destroy() {
    System.out.println("this is destroy method3");
  }
  public void test() {
    System.out.println("testttttttt");
  }
}
다른 점 은 첫 번 째 예 에서 설명 을 사용 하여 spring 과 같은 설정 파일 에 해당 하 는 것 을 알려 주 는 것 입 니 다.여 기 는 실제 설정 파일 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" 
  xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd"> 

<bean id="initOrDestroyTest" class="springTest2.Test3" init-method="init" destroy-method="destroy">
</bean>
</beans>
이 설정 은 spring.xml 에서 가장 간단 한 설정 이 라 고 할 수 있 습 니 다.필요 한 파일 헤 더 를 제외 하고 bean 만 있 습 니 다.그리고 bean 에는 id,calss,init,destroy 방법 만 있 습 니 다.
간단 하기 때문에 한눈 에 알 수 있 습 니 다.id 는 다른 곳 에서 인용 하기 위해 서 입 니 다.class 는 이 bean 에 대응 하 는 클래스 를 지정 하고 뒤의 두 속성 은@Bean 으로 설명 할 때 와 같 습 니 다.
여기 서 bean 과 지정 한 두 가지 방법 은 xml 로 설정 되 어 있 기 때문에 테스트 할 때 약간의 변화 가 필요 합 니 다.

package springTest2;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainTest {
  public static void main(String[] args) {
    ClassPathXmlApplicationContext context1 = new ClassPathXmlApplicationContext("spring.xml");
    System.out.println("#################################");
    context1.close();
  }
}
자바 류 가 아 닌 설정 파일 을 직접 불 러 온 것 과 구별 되 며,AnnotationConfigApplication Context 대신 ClassPathxXmlApplication Context 를 사용 합 니 다.
결 과 는 다음 과 같다.

여기 서 설명 해 야 할 것 은 실제 웹 응용 프로그램 을 사용 할 때 웹.xml 에서 아래 와 같은 설정 을 사용 하여 bean 을 불 러 오고 init method 를 실현 할 수 있다 는 것 입 니 다.

<servlet-name>dispatcher</servlet-name> 
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
  <init-param> 
   <param-name>contextConfigLocation</param-name> 
   <param-value>classpath:spring.xml</param-value> 
  </init-param> 
  <load-on-startup>1</load-on-startup> 
 </servlet> 
 <servlet-mapping> 
  <servlet-name>dispatcher</servlet-name> 
  <url-pattern>/</url-pattern> 
 </servlet-mapping> 
그리고 tomcat 를 시작 한 결 과 는 다음 과 같 습 니 다.
 
이 안 에는 destroy method 가 호출 되 지 않 았 습 니 다.이 유 는 spring 자체 코드 가 bean 을 없 애 는 방법 을 수 동 으로 호출 해 야 하기 때 문 입 니 다.앞의 몇 가지 예 에서 context.close 와 같 습 니 다.
이 방법 을 수 동 으로 호출 하지 않 으 면 bean 은 소각 되 지 않 고 destroy method 를 호출 하지 않 습 니 다.이것 은 바로 웹 xml 에서 설정 한 후에 tomcat 를 시작 하여 구조 함수 와 init 방법 중의 내용 만 인쇄 한 이유 입 니 다.
예 는 모두 간단 하지만 간단 한 예 비 를 통 해 관련 지식 을 더욱 깊이 이해 하고 이해 해 야 실제 응용 에서 더욱 잘 선택 하고 통합 할 수 있다.
자바 코드 에 있 는 init method 와 destroy method 의 세 가지 사용 방식 에 대한 상세 한 설명 은 여기까지 입 니 다.더 많은 자바 에 있 는 init method 와 destroy method 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기