Cấu hình metadata trong Spring

Thông tin cấu hình Spring

  • Thông tin cấu hình Bean trong Spring - BeanDefinition
  • Thông tin cấu hình thuộc tính Bean trong Spring - PropertyValues
  • Thông tin cấu hình của container Spring
  • Thông tin cấu hình bên ngoài của Spring - PropertySource
  • Thông tin cấu hình Profile của Spring - @Profile

Thông tin cấu hình Bean trong Spring

Thông tin cấu hình Bean - BeanDefinition

  • GenericBeanDefinition: BeanDefinition thông thường
  • RootBeanDefinition: BeanDefinition không có Parent hoặc BeanDefinition sau khi hợp nhất
  • AnnotatedBeanDefinition: BeanDefinition được chú thích bằng Annotation

Thông tin cấu hình thuộc tính Bean trong Spring

  • Thông tin cấu hình thuộc tính Bean - PropertyValues
    • Có thể chỉnh sửa - MutablePropertyValues
    • Thành phần thành viên - PropertyValue
  • Lưu trữ ngữ cảnh thuộc tính Bean - AttributeAccessor
  • Phần tử thông tin Bean - BeanMetadataElement

Thông tin cấu hình của container Spring

Thông tin cấu hình XML của Spring - các phần tử beans liên quan

Thuộc tính phần tử beansGiá trị mặc địnhSử dụng trong
profilenull (trống)Giá trị cấu hình Spring Profiles
default-lazy-initdefaultKhi thuộc tính “default-lazy-init” của beans bên ngoài tồn tại, kế thừa giá trị này; nếu không, là “false”
default-mergedefaultKhi thuộc tính “default-merge” của beans bên ngoài tồn tại, kế thừa giá trị này; nếu không, là “false”
default-autowiredefaultKhi thuộc tính “default-autowire” của beans bên ngoài tồn tại, kế thừa giá trị này; nếu không, là “no”
default-autowire-candidatesnull (trống)Mẫu tên mặc định của Spring Beans
default-init-methodnull (trống)Phương thức khởi tạo tùy chỉnh mặc định của Spring Beans
default-destroy-methodnull (trống)Phương thức hủy tùy chỉnh mặc định của Spring Beans

Thông tin cấu hình XML của Spring - liên quan đến ApplicationContext

Phần tử XMLSử dụng trong
<context:annotation-config />Kích hoạt triển khai chú thích trong Spring
<context:component-scan />Quét các @Component và chú thích tùy chỉnh
<context:load-time-weaver />Kích hoạt LoadTimeWeaver trong Spring
<context:mbean-export />Xuất các Spring Beans như JMX Beans
<context:mbean-server />Sử dụng nền tảng hiện tại là MBeanServer
<context:property-placeholder />Tải tài nguyên cấu hình bên ngoài như thuộc tính Spring
<context:property-override />Ghi đè thuộc tính Spring bằng tài nguyên cấu hình bên ngoài

Tải cấu hình Bean trong Spring từ tệp XML

Thực hiện dưới cùng - XmlBeanDefinitionReader

Phần tử XMLSử dụng trong
<beans:beans />Nhiều cấu hình Spring Beans trong một tài nguyên XML duy nhất
<beans:bean />Định nghĩa một Spring Bean đơn lẻ (BeanDefinition)
<beans:alias />Đặt tên định danh cho BeanDefinition (BeanDefinition)
<beans:import />Tải tài nguyên cấu hình XML Spring bên ngoài

Tải cấu hình Bean trong Spring từ tệp Properties

Thực hiện dưới cùng - PropertiesBeanDefinitionReader

Thuộc tính PropertiesSử dụng trong
classTên đầy đủ của lớp Bean
abstractXác định xem BeanDefinition có phải là trừu tượng hay không
parentXác định tên BeanDefinition cha
lazy-initXác định xem Bean có được khởi tạo lười biếng hay không
refTham chiếu đến tên Bean khác
scopeXác định phạm vi của Bean
${n}n biểu thị cho tham số thứ n+1 của hàm tạo

Sử dụng chú thích Java để tải thông tin cấu hình Spring Bean

Chú thích mẫu Spring

Chú thích SpringMô tả tình huốngPhiên bản bắt đầu
@RepositoryChú thích mô hình lưu trữ dữ liệu2.0
@ComponentChú thích mô hình thành phần chung2.5
@ServiceChú thích mô hình dịch vụ2.5
@ControllerChú thích mô hình điều khiển Web2.5
@ConfigurationChú thích lớp cấu hình3.0

Chú thích định nghĩa Spring Bean

Chú thích SpringMô tả tình huốngPhiên bản bắt đầu
@BeanThay thế phần tử XML <bean>3.0
@DependsOnThay thế thuộc tính XML <bean depends-on="…"/>3.0
@LazyThay thế thuộc tính XML `<bean lazy-init=“truefalse” />`
@PrimaryThay thế phần tử XML `<bean primary=“truefalse” />`
@RoleThay thế phần tử XML <bean role="…" />3.1
@LookupThay thế thuộc tính XML <bean lookup-method="…">4.1

Chú thích tiêm phụ thuộc Spring Bean

Chú thích SpringMô tả tình huốngPhiên bản bắt đầu
@AutowiredTiêm phụ thuộc Bean, hỗ trợ nhiều cách tìm kiếm phụ thuộc2.5
@QualifierTìm kiếm phụ thuộc @Autowired chi tiết2.5
Chú thích JavaMô tả tình huốngPhiên bản bắt đầu
@ResourceTương tự như @Autowired2.5
@InjectTương tự như @Autowired2.5

Chú thích điều kiện lắp ráp Spring Bean

Chú thích SpringMô tả tình huốngPhiên bản bắt đầu
@ProfileLắp ráp điều kiện cấu hình3.1
@ConditionalLắp ráp điều kiện lập trình4.0

Chú thích vòng đời của Spring Bean

Chú thích SpringMô tả tình huốngPhiên bản bắt đầu
@PostConstructThay thế phần tử XML <bean init-method="…" /> hoặc InitializingBean2.5
@PreDestroyThay thế phần tử XML <bean destroy-method="…" /> hoặc DisposableBean2.5

Phân tích và đăng ký BeanDefinition của Spring

Chú thích SpringMô tả tình huốngPhiên bản bắt đầu
Tài nguyên XMLXmlBeanDefinitionReader1.0
Tài nguyên PropertiesPropertiesBeanDefinitionReader1.0
Chú thích JavaAnnotatedBeanDefinitionReader3.0

Thực hiện dưới cấu trúc Spring Bean thông tin cấu hình

Phân tích và đăng ký BeanDefinition từ tài nguyên XML của Spring

API cốt lõi - XmlBeanDefinitionReader

  • Tài nguyên - Resource
  • Cơ sở - BeanDefinitionDocumentReader
    • Phân tích XML - Java DOM Level 3 API
    • Phân tích BeanDefinition - BeanDefinitionParserDelegate
    • Đăng ký BeanDefinition - BeanDefinitionRegistry

Phân tích và đăng ký BeanDefinition từ tài nguyên Properties của Spring

API cốt lõi - PropertiesBeanDefinitionReader

  • Tài nguyên
    • Dòng byte - Resource
    • Dòng ký tự - EncodedResouce
  • Cơ sở
    • Lưu trữ - java.util.Properties
    • Phân tích BeanDefinition - API triển khai nội bộ
    • Đăng ký BeanDefinition - BeanDefinitionRegistry

Phân tích và đăng ký BeanDefinition từ chú thích Java của Spring

API cốt lõi - AnnotatedBeanDefinitionReader

  • Tài nguyên
    • Đối tượng lớp - java.lang.Class
  • Cơ sở
    • Đánh giá điều kiện - ConditionEvaluator
    • Giải quyết phạm vi Bean - ScopeMetadataResolver
    • Phân tích BeanDefinition - Triển khai nội bộ API
    • Xử lý BeanDefinition - AnnotationConfigUtils.processCommonDefinitionAnnotations
    • Đăng ký BeanDefinition - BeanDefinitionRegistry

Sử dụng tệp XML để tải thông tin cấu hình của Spring IoC Container

Cấu hình XML liên quan đến Spring IoC Container

Sử dụng chú thích Java để tải thông tin cấu hình của Spring IoC Container

Chú thích cấu hình Spring IoC Container

Chú thích SpringMô tả tình huốngPhiên bản bắt đầu
@ImportResourceThay thế phần tử XML <import>3.0
@ImportNhập Configuration Class3.0
@ComponentScanQuét các lớp được chú thích bằng Spring mô hình trong gói3.1

Chú thích thuộc tính cấu hình Spring IoC

Chú thích SpringMô tả tình huốngPhiên bản bắt đầu
@PropertySourceChú thích thuộc tính cấu hình trừu tượng Property3.1
@PropertySourcesChú thích tập hợp @PropertySource4.0

Extensible XML authoring để mở rộng các phần tử SpringXML

Mở rộng XML của Spring

  • Viết tệp Schema XML: Xác định cấu trúc XML
  • Triển khai NamespaceHandler tùy chỉnh: Liên kết namespace
  • Triển khai BeanDefinitionParser tùy chỉnh: Phân tích phần tử XML và BeanDefinition
  • Đăng ký mở rộng XML: Liên kết namespace và XML Schema

Nguyên lý Extensible XML authoring

Thời điểm kích hoạt

  • AbstractApplicationContext#obtainFreshBeanFactory
    • AbstractRefreshableApplicationContext#refreshBeanFactory
      • AbstractXmlApplicationContext#loadBeanDefinitions
          • XmlBeanDefinitionReader#doLoadBeanDefinitions
              • BeanDefinitionParserDelegate#parseCustomElement

Quy trình cốt lõi

BeanDefinitionParserDelegate#parseCustomElement(org.w3c.dom.Element, BeanDefinition)

  • Lấy namespace
  • Phân tích NamespaceHandler thông qua namespace
  • Xây dựng ParserContext
  • Phân tích phần tử, lấy BeanDefinition

Sử dụng tệp Properties để tải cấu hình hóa bên ngoài

Điều khiển bằng chú thích

  • @org.springframework.context.annotation.PropertySource
  • @org.springframework.context.annotation.PropertySources

Lập trình API

  • org.springframework.core.env.PropertySource
  • org.springframework.core.env.PropertySources

Sử dụng tệp YAML để tải cấu hình hóa bên ngoài

Lập trình API

  • org.springframework.beans.factory.config.YamlProcessor
    • org.springframework.beans.factory.config.YamlMapFactoryBean
    • org.springframework.beans.factory.config.YamlPropertiesFactoryBean

Câu hỏi

Spring có những XML Schema tích hợp sẵn nào?

Các thông tin cấu hình của Spring bao gồm những gì?

  • Thông tin cấu hình Bean: Phân tích BeanDefinition thông qua phương tiện (ví dụ: XML, Properties)
  • Thông tin cấu hình của IoC Container: Điều khiển hành vi của IoC Container thông qua phương tiện (ví dụ: XML, Properties), chẳng hạn như chạy dựa trên chú thích, AOP, v.v.
  • Cấu hình hóa bên ngoài: Điều khiển PropertySource thông qua phương tiện trừu tượng (ví dụ: Properties, YAML)
  • Spring Profile: Cung cấp nhánh điều kiện thông qua cấu hình hóa bên ngoài

Nhược điểm của Extensible XML authoring là gì?

  • Độ phức tạp cao: Nhà phát triển cần hiểu rõ XML Schema, spring.handlers, spring.schemas và API của Spring
  • Hỗ trợ yếu cho các phần tử lồng nhau: Thường cần sử dụng đệ quy hoặc phương pháp phân tích lồng (con) phần tử
  • Hiệu suất xử lý XML kém: Spring XML dựa trên DOM Level 3 API, API này dễ hiểu nhưng hiệu suất kém
  • Khó khả thi để di chuyển khung XML: Khó để tương thích với khung XML hiệu suất cao và tiện ích, chẳng hạn như JAXB