Spring의 Bean 라이프사이클 소스 코드 분석(2부)

콩파괴과정

Spring 컨테이너의 종료 프로세스 중에 Bean 파괴가 발생합니다.
Spring 컨테이너가 닫혀 있을 때,

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = (UserService) context.getBean("userService");
userService.test();

// 容器关闭
context.close();

Bean 생성 프로세스 중 마지막(초기화 후)에는 현재 생성된 Bean이 DisposableBean 인지 확인하는 단계가 있습니다 .

  • 현재 Bean이 DisposableBean 인터페이스를 구현하는지 여부
  • 또는 현재 Bean이 AutoCloseable 인터페이스를 구현하는지 여부
  • Definition에 destroyMethod가 지정되어 있는지 여부
  • 판단을 위해 DestructionAwareBeanPostProcessor.requiresDestruction(bean)을 호출하세요.
    • ApplicationListenerDetector는 ApplicationListener DisposableBean을 직접 만듭니다.
    • @PreDestroy 주석이 있는 InitDestroyAnnotationBeanPostProcessor의 메소드는 DisposableBean입니다.
  • 위의 조건 중 하나라도 충족하는 Bean을 DisposableBeanAdapter 객체에 적용하고 이를 DisposableBeans(LinkedHashMap)에 저장합니다.

Spring 컨테이너 종료 프로세스 중:

  • 먼저 ContextClosedEvent 이벤트를 게시하세요.
  • lifecycleProcessor의 onClose() 메서드를 호출합니다.
  • 싱글톤 빈을 파괴한다
    • 일회용 빈 트래버스
      1. 싱글톤 풀에서 각 일회용 빈을 제거합니다.
      2. 일회용 빈의 destroy()를 호출합니다
      . 3. 이 일회용 빈이 다른 빈에도 종속되어 있으면 다른 빈도 파괴되어야 합니다
      . 4. 이 일회용 빈에도 내부 빈이 포함되어 있으면 다음 빈을 제거합니다. 싱글톤 풀의 빈(내부 빈은 https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-inner-beans 참조)
    • 사용자가 수동으로 등록한 싱글톤 Bean의 beanName을 저장하는 Set인 manualSingletonNames를 지웁니다.
    • Map인 allBeanNamesByType을 지웁니다. 키는 Bean 유형이고 값은 이 유형의 모든 beanNames 배열입니다.
    • 싱글톤 Bean만 저장된다는 점을 제외하면 allBeanNamesByType과 유사한 싱글톤BeanNamesByType을 지웁니다.

여기에는 디자인 패턴이 포함됩니다.
  어댑터 모드가 삭제되면 Spring은 DisposableBean 인터페이스를 구현하는 Bean을 찾습니다.
  그러나 Bean을 정의할 때 Bean이 DisposableBean 인터페이스를 구현하거나 AutoCloseable 인터페이스를 구현하거나 BeanDefinition에 destroyMethodName을 지정하면 Bean은 "DisposableBean"에 속하며 이러한 Bean은 컨테이너가 닫힐 때 해당 메소드를 호출해야 합니다. .파기방법.
  따라서 DisposableBean 인터페이스 또는 AutoCloseable 인터페이스를 DisposableBean 인터페이스에 적용하려면 여기에서 조정이 필요하므로 DisposableBeanAdapter가 사용됩니다.
  AutoCloseable 인터페이스를 구현하는 클래스는 DisposableBeanAdapter로 캡슐화되고 DisposableBeanAdapter는 DisposableBean 인터페이스를 구현합니다.

Supongo que te gusta

Origin blog.csdn.net/beautybug1126/article/details/132371846
Recomendado
Clasificación