Vòng đời của Spring Application Context

Chuẩn bị giai đoạn khởi động của Spring Application Context

Phương thức AbstractApplicationContext#prepareRefresh()

  • Thời gian khởi động - startupDate
  • Trạng thái - closed(false), active(true)
  • Khởi tạo PropertySources - initPropertySources()
  • Kiểm tra các thuộc tính bắt buộc trong Environment
  • Khởi tạo bộ lắng nghe sự kiện
  • Khởi tạo tập hợp sự kiện Spring sớm

Giai đoạn tạo BeanFactory

Phương thức AbstractApplicationContext#obtainFreshBeanFactory()

  • Làm mới BeanFactory của Spring Application Context - refreshBeanFactory()
    • Hủy hoặc đóng BeanFactory nếu đã tồn tại
    • Tạo BeanFactory - createBeanFactory()
    • Thiết lập Id của BeanFactory
    • Thiết lập “Cho phép định nghĩa BeanDefinition trùng lặp” - customizeBeanFactory(DefaultListableBeanFactory)
    • Thiết lập “Cho phép tham chiếu vòng (phụ thuộc)” - customizeBeanFactory(DefaultListableBeanFactory)
    • Tải BeanDefinition - loadBeanDefinitions(DefaultListableBeanFactory) phương thức
    • Liên kết BeanFactory mới với Spring Application Context
  • Trả về BeanFactory của Spring Application Context - getBeanFactory()

Giai đoạn chuẩn bị BeanFactory

Phương thức AbstractApplicationContext#prepareBeanFactory(ConfigurableListableBeanFactory)

  • Liên kết ClassLoader
  • Thiết lập trình xử lý biểu thức Bean
  • Thêm PropertyEditorRegistrar - ResourceEditorRegistrar
  • Thêm ApplicationContextAwareProcessor - triển khai Aware callback interface BeanPostProcessor
  • Bỏ qua Aware callback interface như là giao diện phụ thuộc
  • Đăng ký ResolvableDependency - BeanFactory, ResourceLoader, ApplicationEventPublisher và ApplicationContext
  • Đăng ký ApplicationListenerDetector
  • Đăng ký LoadTimeWeaverAwareProcessor
  • Đăng ký đối tượng Singleton - Environment, Java System Properties và biến môi trường OS

Giai đoạn xử lý sau BeanFactory

  • Phương thức AbstractApplicationContext#postProcessBeanFactory(ConfigurableListableBeanFactory)
    • Được ghi đè bởi lớp con
  • Phương thức AbstractApplicationContext#invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory)
    • Gọi các phương thức xử lý sau BeanFactoryPostProcessor hoặc BeanDefinitionRegistry
    • Đăng ký LoadTimeWeaverAwareProcessor

Giai đoạn đăng ký BeanPostProcessor của BeanFactory

Phương thức AbstractApplicationContext#registerBeanPostProcessors(ConfigurableListableBeanFactory)

  • Đăng ký các BeanPostProcessor có thứ tự ưu tiên (PriorityOrdered)
  • Đăng ký các BeanPostProcessor có thứ tự (Ordered)
  • Đăng ký các BeanPostProcessor thông thường
  • Đăng ký MergedBeanDefinitionPostProcessor
  • Đăng ký ApplicationListenerDetector

Khởi tạo Bean tích hợp sẵn: MessageSource

Phương thức AbstractApplicationContext#initMessageSource()

Khởi tạo Bean tích hợp sẵn: Trình phát sóng sự kiện Spring

Phương thức AbstractApplicationContext#initApplicationEventMulticaster()

Giai đoạn làm mới Spring Application Context

Phương thức AbstractApplicationContext#onRefresh()

Được ghi đè bởi các lớp con

  • org.springframework.web.context.support.AbstractRefreshableWebApplicationContext#onRefresh()
  • org.springframework.web.context.support.GenericWebApplicationContext#onRefresh()
  • org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext#onRefresh()
  • org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext#onRefresh()
  • org.springframework.web.context.support.StaticWebApplicationContext#onRefresh()

Giai đoạn đăng ký trình lắng nghe sự kiện Spring

Phương thức AbstractApplicationContext#registerListeners()

  • Thêm các đối tượng ApplicationListener liên quan đến ngữ cảnh ứng dụng hiện tại (tập hợp)
  • Thêm các Bean ApplicationListener đã đăng ký trong BeanFactory
  • Phát sóng sự kiện Spring sớm

Giai đoạn hoàn thành việc khởi tạo BeanFactory

Phương thức AbstractApplicationContext#finishBeanFactoryInitialization(ConfigurableListableBeanFactory)

  • Liên kết BeanFactory với Bean ConversionService, nếu có
  • Thêm đối tượng StringValueResolver
  • Tìm kiếm Bean LoadTimeWeaverAware phụ thuộc
  • Đặt ClassLoader tạm thời của BeanFactory thành null
  • Đóng băng cấu hình BeanFactory
  • Khởi tạo các Bean không trễ đơn lẻ

Giai đoạn hoàn thành việc làm mới Spring Application Context

Phương thức AbstractApplicationContext#finishRefresh()

  • Xóa bộ nhớ cache của ResourceLoader - clearResourceCaches() @since 5.0
  • Khởi tạo đối tượng LifecycleProcessor - initLifecycleProcessor()
  • Gọi phương thức LifecycleProcessor#onRefresh()
  • Phát sóng sự kiện ứng dụng ngữ cảnh Spring đã được làm mới - ContextRefreshedEvent
  • Quản lý các Bean sống trên MBeanServer

Giai đoạn khởi động Spring Application Context

Phương thức AbstractApplicationContext#start()

  • Khởi động LifecycleProcessor
    • Tìm kiếm các Bean Lifecycle
    • Khởi động các Bean Lifecycle
  • Phát sóng sự kiện ứng dụng ngữ cảnh Spring đã được khởi động - ContextStartedEvent

Giai đoạn dừng của Spring Application Context

Phương thức AbstractApplicationContext#stop()

  • Dừng LifecycleProcessor
    • Tìm kiếm các Bean Lifecycle
    • Dừng các Bean Lifecycle
  • Phát sóng sự kiện ứng dụng ngữ cảnh Spring đã dừng - ContextStoppedEvent

Giai đoạn đóng của Spring Application Context

Phương thức AbstractApplicationContext#close()

  • Trạng thái - active(false), closed(true)
  • Hủy bỏ việc quản lý Live Beans trên JMX
    • LiveBeansView.unregisterApplicationContext(ConfigurableApplicationContext)
  • Phát sóng sự kiện ứng dụng ngữ cảnh Spring đã đóng - ContextClosedEvent
  • Dừng LifecycleProcessor
    • Tìm kiếm các Bean Lifecycle
    • Dừng các Bean Lifecycle
  • Hủy bỏ các Spring Beans
  • Đóng BeanFactory
  • Gọi onClose()
  • Đăng ký luồng Shutdown Hook (nếu đã đăng ký)

Câu hỏi

Có những giai đoạn nào trong vòng đời của Spring Application Context?

  • Giai đoạn làm mới - ConfigurableApplicationContext#refresh()
  • Giai đoạn khởi động - ConfigurableApplicationContext#start()
  • Giai đoạn dừng - ConfigurableApplicationContext#stop()
  • Giai đoạn đóng - ConfigurableApplicationContext#close()