跳至主要內容

Spring 配置元数据

钝悟...大约 6 分钟Java框架SpringSpring核心Java框架SpringBean

Spring 配置元数据

Spring 配置元信息

  • Spring Bean 配置元信息 - BeanDefinition
  • Spring Bean 属性元信息 - PropertyValues
  • Spring 容器配置元信息
  • Spring 外部化配置元信息 - PropertySource
  • Spring Profile 元信息 - @Profile

Spring Bean 配置元信息

Bean 配置元信息 - BeanDefinition

  • GenericBeanDefinition:通用型 BeanDefinition
  • RootBeanDefinition:无 Parent 的 BeanDefinition 或者合并后 BeanDefinition
  • AnnotatedBeanDefinition:注解标注的 BeanDefinition

Spring Bean 属性元信息

  • Bean 属性元信息 - PropertyValues
    • 可修改实现 - MutablePropertyValues
    • 元素成员 - PropertyValue
  • Bean 属性上下文存储 - AttributeAccessor
  • Bean 元信息元素 - BeanMetadataElement

Spring 容器配置元信息

Spring XML 配置元信息 - beans 元素相关

beans 元素属性默认值使用场景
profilenull(留空)Spring Profiles 配置值
default-lazy-initdefault当 outter beans “default-lazy-init” 属性存在时,继承该值,否则为“false”
default-mergedefault当 outter beans “default-merge” 属性存在时,继承该值,否则为“false”
default-autowiredefault当 outter beans “default-autowire” 属性存在时,继承该值,否则为“no”
default-autowire-candidatesnull(留空)默认 Spring Beans 名称 pattern
default-init-methodnull(留空)默认 Spring Beans 自定义初始化方法
default-destroy-methodnull(留空)默认 Spring Beans 自定义销毁方法

Spring XML 配置元信息 - 应用上下文相关

XML 元素使用场景
<context:annotation-config />激活 Spring 注解驱动
<context:component-scan />Spring @Component 以及自定义注解扫描
<context:load-time-weaver />激活 Spring LoadTimeWeaver
<context:mbean-export />暴露 Spring Beans 作为 JMX Beans
<context:mbean-server />将当前平台作为 MBeanServer
<context:property-placeholder />加载外部化配置资源作为 Spring 属性配
<context:property-override />利用外部化配置资源覆盖 Spring 属

基于 XML 文件装载 Spring Bean 配置元信息

底层实现 - XmlBeanDefinitionReader

XML 元素使用场景
<beans:beans />单 XML 资源下的多个 Spring Beans 配置
<beans:bean />单个 Spring Bean 定义(BeanDefinition)配置
<beans:alias />为 Spring Bean 定义(BeanDefinition)映射别名
<beans:import />加载外部 Spring XML 配置资源

基于 Properties 文件装载 Spring Bean 配置元信息

底层实现 - PropertiesBeanDefinitionReader

Properties 属性名使用场景
classBean 类全称限定名
abstract是否为抽象的 BeanDefinition
parent指定 parent BeanDefinition 名称
lazy-init是否为延迟初始化
ref引用其他 Bean 的名称
scope设置 Bean 的 scope 属性
$n 表示第 n+1 个构造器参数

基于 Java 注解装载 Spring Bean 配置元信息

Spring 模式注解

Spring 注解场景说明起始版本
@Repository数据仓储模式注解2.0
@Component通用组件模式注解2.5
@Service服务模式注解2.5
@ControllerWeb 控制器模式注解2.5
@Configuration配置类模式注解3.0

Spring Bean 定义注解

| Spring 注解 | 场景说明 | 起始版本 |
| ------------ | ------------------------------------------ | ----------- | --- |
| @Bean | 替换 XML 元素 <bean> | 3.0 |
| @DependsOn | 替代 XML 属性 <bean depends-on="..."/> | 3.0 |
| @Lazy | 替代 XML 属性 <bean lazy-init="true | falses" /> | 3.0 |
| @Primary | 替换 XML 元素 <bean primary="true | false" /> | 3.0 |
| @Role | 替换 XML 元素 <bean role="..." /> | 3.1 |
| @Lookup | 替代 XML 属性 <bean lookup-method="..."> | 4.1 |

Spring Bean 依赖注入注解

Spring 注解场景说明起始版本
@AutowiredBean 依赖注入,支持多种依赖查找方式2.5
@Qualifier细粒度的 @Autowired 依赖查找2.5
Java 注解场景说明起始版本
@Resource类似于 @Autowired2.5
@Inject类似于 @Autowired2.5

Spring Bean 条件装配注解

Spring 注解场景说明起始版本
@Profile配置化条件装配3.1
@Conditional编程条件装配4.0

Spring Bean 生命周期回调注解

Spring 注解场景说明起始版本
@PostConstruct替换 XML 元素 <bean init-method="..." /> 或 InitializingBean2.5
@PreDestroy替换 XML 元素 <bean destroy-method="..." /> 或 DisposableBean2.5

Spring BeanDefinition 解析与注册

Spring 注解场景说明起始版本
XML 资源XmlBeanDefinitionReader1.0
Properties 资源PropertiesBeanDefinitionReader1.0
Java 注解AnnotatedBeanDefinitionReader3.0

Spring Bean 配置元信息底层实现

Spring XML 资源 BeanDefinition 解析与注册

核心 API - XmlBeanDefinitionReader

  • 资源 - Resource
  • 底层 - BeanDefinitionDocumentReader
    • XML 解析 - Java DOM Level 3 API
    • BeanDefinition 解析 - BeanDefinitionParserDelegate
    • BeanDefinition 注册 - BeanDefinitionRegistry

Spring Properties 资源 BeanDefinition 解析与注册

核心 API - PropertiesBeanDefinitionReader

  • 资源
    • 字节流 - Resource
    • 字符流 - EncodedResouce
  • 底层
    • 存储 - java.util.Properties
    • BeanDefinition 解析 - API 内部实现
    • BeanDefinition 注册 - BeanDefinitionRegistry

Spring Java 注册 BeanDefinition 解析与注册

核心 API - AnnotatedBeanDefinitionReader

  • 资源
    • 类对象 - java.lang.Class
  • 底层
    • 条件评估 - ConditionEvaluator
    • Bean 范围解析 - ScopeMetadataResolver
    • BeanDefinition 解析 - 内部 API 实现
    • BeanDefinition 处理 - AnnotationConfigUtils.processCommonDefinitionAnnotations
    • BeanDefinition 注册 - BeanDefinitionRegistry

基于 XML 文件装载 Spring IoC 容器配置元信息

Spring IoC 容器相关 XML 配置

命名空间所属模块Schema 资源 URL
beansspring-beanshttps://www.springframework.org/schema/beans/spring-beans.xsdopen in new window
contextspring-contexthttps://www.springframework.org/schema/context/spring-context.xsdopen in new window
aopspring-aophttps://www.springframework.org/schema/aop/spring-aop.xsdopen in new window
txspring-txhttps://www.springframework.org/schema/tx/spring-tx.xsdopen in new window
utilspring-beansbeans https://www.springframework.org/schema/util/spring-util.xsdopen in new window
toolspring-beanshttps://www.springframework.org/schema/tool/spring-tool.xsdopen in new window

基于 Java 注解装载 Spring IoC 容器配置元信息

Spring IoC 容器装配注解

Spring 注解场景说明起始版本
@ImportResource替换 XML 元素 <import>3.0
@Import导入 Configuration Class3.0
@ComponentScan扫描指定 package 下标注 Spring 模式注解的类3.1

Spring IoC 配属属性注解

Spring 注解场景说明起始版本
@PropertySource配置属性抽象 PropertySource 注解3.1
@PropertySources@PropertySource 集合注解4.0

基于 Extensible XML authoring 扩展 SpringXML 元素

Spring XML 扩展

  • 编写 XML Schema 文件:定义 XML 结构
  • 自定义 NamespaceHandler 实现:命名空间绑定
  • 自定义 BeanDefinitionParser 实现:XML 元素与 BeanDefinition 解析
  • 注册 XML 扩展:命名空间与 XML Schema 映射

Extensible XML authoring 扩展原理

触发时机

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

核心流程

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

  • 获取 namespace
  • 通过 namespace 解析 NamespaceHandler
  • 构造 ParserContext
  • 解析元素,获取 BeanDefinintion

基于 Properties 文件装载外部化配置

注解驱动

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

API 编程

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

基于 YAML 文件装载外部化配置

API 编程

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

问题

Spring 內建 XML Schema 常见有哪些

命名空间所属模块Schema 资源 URL
beansspring-beanshttps://www.springframework.org/schema/beans/spring-beans.xsdopen in new window
contextspring-contexthttps://www.springframework.org/schema/context/spring-context.xsdopen in new window
aopspring-aophttps://www.springframework.org/schema/aop/spring-aop.xsdopen in new window
txspring-txhttps://www.springframework.org/schema/tx/spring-tx.xsdopen in new window
utilspring-beansbeans https://www.springframework.org/schema/util/spring-util.xsdopen in new window
toolspring-beanshttps://www.springframework.org/schema/tool/spring-tool.xsdopen in new window

Spring 配置元信息具体有哪些

  • Bean 配置元信息:通过媒介(如 XML、Proeprties 等),解析 BeanDefinition
  • IoC 容器配置元信息:通过媒介(如 XML、Proeprties 等),控制 IoC 容器行为,比如注解驱动、AOP 等
  • 外部化配置:通过资源抽象(如 Proeprties、YAML 等),控制 PropertySource
  • Spring Profile:通过外部化配置,提供条件分支流程

Extensible XML authoring 的缺点

  • 高复杂度:开发人员需要熟悉 XML Schema,spring.handlers,spring.schemas 以及 Spring API
  • 嵌套元素支持较弱:通常需要使用方法递归或者其嵌套解析的方式处理嵌套(子)元素
  • XML 处理性能较差:Spring XML 基于 DOM Level 3 API 实现,该 API 便于理解,然而性能较差
  • XML 框架移植性差:很难适配高性能和便利性的 XML 框架,如 JAXB

参考资料

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.7