콩파괴과정
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 인터페이스를 구현합니다.