Nguồn phụ thuộc của Spring IoC

Nguồn của việc tìm kiếm phụ thuộc

Nguồn tìm kiếm

NguồnDữ liệu cấu hình
Spring BeanDefinition<bean id ="user" class="xxx.xxx.User">
@Bean public User user() {…}
BeanDefinitionBuilder
Đối tượng SingletonImplement API

BeanDefinition tích hợp sẵn trong Spring

Tên BeanThể hiện BeanSử dụng trong
org.springframework.context.annotation.internalConfigurationAnnotationProcessorĐối tượng ConfigurationClassPostProcessorXử lý các lớp cấu hình Spring
org.springframework.context.annotation.internalAutowiredAnnotationProcessorĐối tượng AutowiredAnnotationBeanPostProcessorXử lý chú thích @Autowired và @Value
org.springframework.context.annotation.internalCommonAnnotationProcessorĐối tượng CommonAnnotationBeanPostProcessor(Kích hoạt điều kiện) Xử lý chú thích JSR-250, như @PostConstruct
org.springframework.context.event.internalEventListenerProcessorĐối tượng EventListenerMethodProcessorXử lý các phương thức lắng nghe sự kiện Spring được đánh dấu bằng @EventListener

Đối tượng Singleton tích hợp sẵn trong Spring

Tên BeanThể hiện BeanSử dụng trong
environmentĐối tượng EnvironmentCấu hình bên ngoài và Profiles
systemPropertiesĐối tượng java.util.PropertiesThuộc tính hệ thống Java
systemEnvironmentĐối tượng java.util.MapBiến môi trường hệ thống
messageSourceĐối tượng MessageSourceVăn bản đa ngôn ngữ
lifecycleProcessorĐối tượng LifecycleProcessorXử lý Bean Lifecycle
applicationEventMulticasterĐối tượng ApplicationEventMulticasterTruyền phát sự kiện Spring

Nguồn của việc tiêm phụ thuộc

NguồnDữ liệu cấu hình
Spring BeanDefinition<bean id ="user" class="xxx.xxx.User">
@Bean public User user() {…}
BeanDefinitionBuilder
Đối tượng SingletonImplement API
Đối tượng không quản lý bởi Spring

Quản lý đối tượng bởi Spring và đối tượng không quản lý bởi Spring

NguồnĐối tượng Spring BeanQuản lý vòng đờiThông tin cấu hìnhSử dụng trong
Spring BeanDefinitionTìm kiếm phụ thuộc, tiêm phụ thuộc
Đối tượng SingletonKhôngKhôngTìm kiếm phụ thuộc, tiêm phụ thuộc
Resolvable DependencyKhôngKhôngKhôngTiêm phụ thuộc

BeanDefinition của Spring là nguồn phụ thuộc

  • Dữ liệu: BeanDefinition
  • Đăng ký: BeanDefinitionRegistry#registerBeanDefinition
  • Loại: Trì hoãn và không trì hoãn
  • Thứ tự: Thứ tự vòng đời Bean theo thứ tự đăng ký

Đối tượng Singleton là nguồn phụ thuộc

  • Yếu tố
    • Nguồn: Đối tượng Java thông thường từ bên ngoài (không nhất thiết phải là POJO)
    • Đăng ký: SingletonBeanRegistry#registerSingleton
  • Giới hạn
    • Không quản lý vòng đời
    • Không thể triển khai việc khởi tạo đối tượng trì hoãn

Đối tượng không quản lý bởi Spring là nguồn phụ thuộc

  • Yếu tố
    • Đăng ký: ConfigurableListableBeanFactory#registerResolvableDependency
  • Giới hạn
    • Không quản lý vòng đời
    • Không thể triển khai việc khởi tạo đối tượng trì hoãn
    • Không thể tìm kiếm phụ thuộc

Cấu hình bên ngoài là nguồn phụ thuộc

  • Yếu tố
    • Loại: Nguồn phụ thuộc đối tượng Spring không thông thường
  • Giới hạn
    • Không quản lý vòng đời
    • Không thể triển khai việc khởi tạo đối tượng trì hoãn
    • Không thể tìm kiếm phụ thuộc

Câu hỏi

Nguồn phụ thuộc của việc tiêm và tìm kiếm có giống nhau không?

Không, nguồn phụ thuộc của việc tìm kiếm chỉ giới hạn trong BeanDefinition của Spring và đối tượng Singleton, trong khi nguồn phụ thuộc của việc tiêm còn bao gồm Resolvable Dependency và cấu hình bên ngoài được đánh dấu bằng @Value.

Có thể đăng ký đối tượng Singleton sau khi bắt đầu Spring IoC container không?

Có thể, việc đăng ký đối tượng Singleton khác với BeanDefinition, BeanDefinition sẽ bị ảnh hưởng bởi phương thức ConfigurableListableBeanFactory#freezeConfiguration(), trong khi đối tượng Singleton không bị giới hạn này.

Nguồn phụ thuộc của việc tiêm phụ thuộc trong Spring bao gồm những gì?

  • Spring BeanDefinition
  • Đối tượng Singleton
  • Resolvable Dependency
  • Cấu hình bên ngoài được đánh dấu bằng @Value