当前位置: 首页 > wzjs >正文

观音桥网站建设网站建设百度浏览器官网下载

观音桥网站建设网站建设,百度浏览器官网下载,济南网站推广优化外包,做公装的什么网站好Spring 源码解读(二)——BeanDefinition 核心原则: 不要深究:理解即可,细节不必深究。基本准则: 接口:定义能力。抽象类:定义可复用、可重用的代码。 BeanDefinition 继承关系 Bean…

Spring 源码解读(二)——BeanDefinition

image-20250223183309171

核心原则

  • 不要深究:理解即可,细节不必深究。
  • 基本准则
    • 接口:定义能力。
    • 抽象类:定义可复用、可重用的代码。

BeanDefinition 继承关系

BeanDefinition 继承关系


BeanDefinition 的作用

翻译自源码文档
BeanDefinition 描述了一个 Bean 实例,包含属性值、构造函数参数值以及由具体实现提供的更多信息。

BeanDefinition 示例


核心点解析

  1. 最终转换为 RootDefinition
    例如,GenericBeanDefinition(Spring 2.5 引入)是通过 XML 配置读取的,最终会转换为 RootBeanDefinition

  2. 抽象类 AbstractBeanDefinition
    其中定义了通用的成员变量,子类会继承这些变量。

    AbstractBeanDefinition 示例

  3. RootBeanDefinition 的特殊性
    RootBeanDefinition 中,getParent() 方法返回 null


代码测试

以下是一个简单的测试代码,演示如何创建和配置 GenericBeanDefinition

@Test
public void test() throws IntrospectionException {// 创建 GenericBeanDefinitionGenericBeanDefinition beanDefinition = new GenericBeanDefinition();beanDefinition.setBeanClassName("com.lucifer.User");beanDefinition.setLazyInit(false);// 设置属性值MutablePropertyValues propertyValues = new MutablePropertyValues();propertyValues.add("name", "lucifer");propertyValues.add("age", 18);beanDefinition.setPropertyValues(propertyValues);System.out.println(beanDefinition);
}

从xml中获取bean的过程

1. 整体流程概述

从 XML 中获取 Bean 的过程可以分为以下几个步骤:

  1. 加载 XML 配置文件:读取 XML 文件并解析为 Document 对象。
  2. 解析 Bean 定义:将 XML 中的 <bean> 标签解析为 BeanDefinition
  3. 注册 Bean 定义:将 BeanDefinition 注册到 BeanFactory 中。
  4. 实例化 Bean:根据 BeanDefinition 创建 Bean 实例。
  5. 依赖注入:为 Bean 注入所需的依赖。

2. 源码解析

2.1 加载 XML 配置文件

Spring 通过 XmlBeanDefinitionReader 类加载 XML 配置文件,并将其解析为 Document 对象。

// XmlBeanDefinitionReader.java
public int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException {return loadBeanDefinitions(new EncodedResource(resource));
}
  • Resource:表示 XML 文件的资源对象。
  • EncodedResource:对资源进行编码处理。
2.2 解析 Bean 定义

Spring 使用 DefaultBeanDefinitionDocumentReader 解析 XML 文件中的 <bean> 标签。

// DefaultBeanDefinitionDocumentReader.java
protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {if (delegate.isDefaultNamespace(root)) {NodeList nl = root.getChildNodes();for (int i = 0; i < nl.getLength(); i++) {Node node = nl.item(i);if (node instanceof Element) {Element ele = (Element) node;if (delegate.isDefaultNamespace(ele)) {parseDefaultElement(ele, delegate); // 解析默认元素(如 <bean>)} else {delegate.parseCustomElement(ele); // 解析自定义元素}}}} else {delegate.parseCustomElement(root); // 解析自定义元素}
}
  • parseDefaultElement:解析 <bean> 标签。
  • parseCustomElement:解析自定义标签(如 <context:component-scan>)。
2.3 注册 Bean 定义

解析后的 BeanDefinition 会被注册到 DefaultListableBeanFactory 中。

// DefaultListableBeanFactory.java
public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)throws BeanDefinitionStoreException {this.beanDefinitionMap.put(beanName, beanDefinition);this.beanDefinitionNames.add(beanName);
}
  • beanDefinitionMap:存储 Bean 名称与 BeanDefinition 的映射。
  • beanDefinitionNames:存储所有 Bean 的名称。
2.4 实例化 Bean

Spring 通过 AbstractBeanFactorygetBean 方法实例化 Bean。

// AbstractBeanFactory.java
public Object getBean(String name) throws BeansException {return doGetBean(name, null, null, false);
}
  • doGetBean:核心方法,负责 Bean 的实例化和依赖注入。
2.5 依赖注入

Spring 通过 AbstractAutowireCapableBeanFactory 完成依赖注入。

// AbstractAutowireCapableBeanFactory.java
protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {// 注入属性值if (mbd.getPropertyValues() != null) {applyPropertyValues(beanName, mbd, bw, mbd.getPropertyValues());}
}
  • applyPropertyValues:将属性值注入到 Bean 中。

3. 代码示例

以下是一个简单的 XML 配置文件示例:

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="user" class="com.example.User"><property name="name" value="John"/><property name="age" value="30"/></bean>
</beans>

运行 HTML

3.1 加载 XML 配置文件
ClassPathResource resource = new ClassPathResource("applicationContext.xml");
XmlBeanFactory beanFactory = new XmlBeanFactory(resource);
3.2 获取 Bean 实例
User user = (User) beanFactory.getBean("user");
System.out.println(user.getName()); // 输出: John
System.out.println(user.getAge());  // 输出: 30

4. 关键类解析

类名作用
XmlBeanDefinitionReader读取 XML 配置文件并解析为 BeanDefinition
DefaultBeanDefinitionDocumentReader解析 XML 文件中的 <bean> 标签。
DefaultListableBeanFactory存储和管理 BeanDefinition
AbstractBeanFactory提供 getBean 方法,负责 Bean 的实例化和依赖注入。
AbstractAutowireCapableBeanFactory实现 Bean 的依赖注入逻辑。

5. 总结

从 XML 中获取 Bean 的过程可以分为以下几个步骤:

  1. 加载 XML 配置文件:通过 XmlBeanDefinitionReader 读取 XML 文件。
  2. 解析 Bean 定义:将 <bean> 标签解析为 BeanDefinition
  3. 注册 Bean 定义:将 BeanDefinition 注册到 BeanFactory 中。
  4. 实例化 Bean:通过 getBean 方法创建 Bean 实例。
  5. 依赖注入:将属性值注入到 Bean 中。
http://www.dtcms.com/wzjs/507487.html

相关文章:

  • 哈尔滨最新疫情轨迹公布而的跟地seo排名点击软件
  • 网站流量提供商市场营销方案
  • 织梦cms发布侵权网站清单百度关键词优化大师
  • 西宁做网站制作的公司哪家好百度网盘官网
  • 有赞微商城下载搜索引擎优化英文简称
  • 工信部网站 备案网站推广四个阶段
  • 网站流量攻击软件chrome官网
  • 山东做网站费用保定seo推广外包
  • 做网站犯法了 程序员有责任吗专业黑帽seo
  • 互联网服务杭州seo网站建设
  • 青海微信网站建设网站要怎么创建
  • 自己建设一个网站步骤南昌seo排名优化
  • 武汉网站推广优化公司南昌seo排名扣费
  • 有谁知道知乎网站是谁做的拓客软件排行榜
  • 四川企业高端网站建设html期末大作业个人网站制作
  • 微页制作网站模板下载软件短期培训就业学校
  • app开发外包网优化网站软文
  • 有免费注册网站吗百度推广怎么开户
  • 三只松鼠的网站建设理念重庆seo全网营销
  • 网站飘动广告代码关键词搜索工具app
  • 淘宝客商品推广网站建设免费网站开发平台
  • 做网站要固定ip东营网站seo
  • wordpress 文章归档页面网络seo外包
  • 淅川微网站建设钟南山今天感染新冠了
  • 网站建设找客户渠道公司官网优化方案
  • 安阳市建设安全监督站网站电脑网络优化软件
  • 做论坛网站赚钱吗网站优化策略分析论文
  • 深圳网页制作设计宁波seo推荐
  • 温州营销推广公司seo外包服务
  • 中国建设招标网站首页优化大师怎么删除学生