主要内容

  • 添加PropertyValue类表示Bean的属性。

  • 为Bean定义对象BeanDefinition添加PropertyValues列表用来存储Bean的各种属性。

  • Bean实例化时根据PropertyValues填充属性。

代码分支

populate-bean-with-property-values

核心代码

PropertyValue

表示类的属性

public class PropertyValue {
//属性名
private final String name;
//属性值
private final Object value;
public PropertyValue(String name, Object value) {
this.name = name;
this.value = value;
}
public String getName() {
return name;
}
public Object getValue() {
return value;
}
}

PropertyValues

内部维护一个PropertyValue列表,维护bean的各种属性。

ublic class PropertyValues {
private final List<PropertyValue> propertyValueList = new ArrayList<PropertyValue>();
public void addPropertyValue(PropertyValue propertyValue) {
this.propertyValueList.add(propertyValue);
} public PropertyValue[] getPropertyValues() {
return propertyValueList.toArray(new PropertyValue[0]);
} public PropertyValue getPropertyValue(String propertyName){
for(int i = 0; i < propertyValueList.size(); i++) {
PropertyValue propertyValue = propertyValueList.get(i);
if(propertyValue.getName().equals(propertyName)){
return propertyValue;
}
}
return null;
}
}

BeanDefinition

public class BeanDefinition {
private Class clazz;
private PropertyValues propertyValues; public BeanDefinition() {
}
public BeanDefinition(Class clazz) {
this.clazz = clazz;
}
public BeanDefinition(Class clazz, PropertyValues propertyValues) {]
this.clazz = clazz;
this.propertyValues = propertyValues;
}
public Class getClazz() {
return clazz;
}
public void setClazz(Class clazz) {
this.clazz = clazz;
}
public PropertyValues getPropertyValues() {
return propertyValues;
}
public void setPropertyValues(PropertyValues propertyValues) {
this.propertyValues = propertyValues;
}
}

AbstractAutowireCapableBeanFactory

doCreateBean方法

Bean实例化时注入属性

        protected Object doCreateBean(String beanName, BeanDefinition beanDefinition) {
Object bean = null;
try {
bean = createBeanInstance(beanDefinition);
//为bean填充属性
applyPropertyValues(beanName, bean, beanDefinition);
} catch (Exception e) {
throw new BeansException("Instantiation of bean failed", e);
}
addSingleton(beanName, bean);
return bean;
}

applyPropertyValues方法

    private void applyPropertyValues(String beanName, Object bean, BeanDefinition beanDefinition) {
for(PropertyValue propertyValue : beanDefinition.getPropertyValues().getPropertyValues()){
String name = propertyValue.getName();
Object value = propertyValue.getValue();
BeanUtil.setProperty(bean,name,value);
}
}

测试

    @Test
public void test(){
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
PropertyValue propertyValue1 = new PropertyValue("name", "zhangSan");
PropertyValue propertyValue2 = new PropertyValue("age", 15);
PropertyValues propertyValues = new PropertyValues();
propertyValues.addPropertyValue(propertyValue1);
propertyValues.addPropertyValue(propertyValue2);
BeanDefinition beanDefinition = new BeanDefinition(Person.class, propertyValues);
factory.registerBeanDefinition("person", beanDefinition);
Person person = (Person)factory.getBean("person");
System.out.println(person);
}

测试结果

Person{name='zhangSan', age='15'}

[源码系列:手写spring] IOC第四节:Bean属性注入的更多相关文章

  1. Spring源码分析 手写简单IOC容器

    Spring的两大特性就是IOC和AOP. IOC Container,控制反转容器,通过读取配置文件或注解,将对象封装成Bean存入IOC容器待用,程序需要时再从容器中取,实现控制权由程序员向程序的 ...

  2. 《四 spring源码》手写springioc框架

    手写SpringIOCXML版本 /** * 手写Spring专题 XML方式注入bean * * * */ public class ClassPathXmlApplicationContext { ...

  3. 框架源码系列十:Spring AOP(AOP的核心概念回顾、Spring中AOP的用法、Spring AOP 源码学习)

    一.AOP的核心概念回顾 https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/core.html#a ...

  4. 曹工说Spring Boot源码(27)-- Spring的component-scan,光是include-filter属性的各种配置方式,就够玩半天了.md

    写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...

  5. 从零开始手写 spring ioc 框架,深入学习 spring 源码

    IoC Ioc 是一款 spring ioc 核心功能简化实现版本,便于学习和理解原理. 创作目的 使用 spring 很长时间,对于 spring 使用非常频繁,实际上对于源码一直没有静下心来学习过 ...

  6. 框架源码系列六:Spring源码学习之Spring IOC源码学习

    Spring 源码学习过程: 一.搞明白IOC能做什么,是怎么做的  1. 搞明白IOC能做什么? IOC是用为用户创建.管理实例对象的.用户需要实例对象时只需要向IOC容器获取就行了,不用自己去创建 ...

  7. 《四 spring源码》手写springmvc

    手写SpringMVC思路 1.web.xml加载  为了读取web.xml中的配置,我们用到ServletConfig这个类,它代表当前Servlet在web.xml中的配置信息.通过web.xml ...

  8. Spring源码 20 手写模拟源码

    参考源 https://www.bilibili.com/video/BV1tR4y1F75R?spm_id_from=333.337.search-card.all.click https://ww ...

  9. 利用递归,反射,注解等,手写Spring Ioc和Di 底层(分分钟喷倒面试官)了解一下

    再我们现在项目中Spring框架是目前各大公司必不可少的技术,而大家都知道去怎么使用Spring ,但是有很多人都不知道SpringIoc底层是如何工作的,而一个开发人员知道他的源码,底层工作原理,对 ...

  10. Spring源码剖析3:Spring IOC容器的加载过程

    本文转自五月的仓颉 https://www.cnblogs.com/xrq730 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https ...

随机推荐

  1. VSTO踩坑记录(1)- 从零开始开发outlook插件

    概述 vsto是微软提供的一种开发office插件的一种技术,现在看来有点落后了,不过项目需要的情况下,总不能跟领导说这活干不了吧?附上官方文档 安装好必备的开发环境,我用的是vs2022,在安装程序 ...

  2. linux下VEP的安装

    VEP(Variant Effect Predictor)作为Ensembl官方推出的变异影响预测软件,被广泛使用,以下内容也来自Ensembl 软件包下载(ZIP格式): curl -L-Ohttp ...

  3. c# 远程调用 / Remoting IpcChannel sample

    . 远程调用 1. 创建一个远程的可序列化的类,这个类可以在远程调用中用于传输来去,似乎是个公共的类: using System; using System.Collections.Generic; ...

  4. jdk并发包源码解析

    一.总括 java底层并发包,笔者将该包大致分成3个层次. 1.基础依赖: 共享变量volatile:有利于线程可见性.Unsafe类:CAS(Compare and Swap)比较并交换,用于并发下 ...

  5. SpringBoot的两种启动方式原理

    使用内置tomcat启动 配置案例 启动方式 IDEA中main函数启动 mvn springboot-run java -jar XXX.jar 使用这种方式时,为保证服务在后台运行,会使用nohu ...

  6. e-prime3安装

    e-prime2.0版本太老,现在安装尝试3.0. 下载 链接: https://pan.baidu.com/s/1XJFDqhoArpIwEf0NpKvoIQ 提取码: h5xk 安装 解压安装包后 ...

  7. Breakout pg walkthrough Intermediate

    nmap ┌──(root㉿kali)-[~/lab] └─# nmap -p- -A 192.168.192.182 Starting Nmap 7.94SVN ( https://nmap.org ...

  8. Navicat怎样查看数据库密码

    Navicat怎样查看数据库密码 前言 本文来源:Navicat怎样查看数据库密码_低端玩家的博客-CSDN博客_navicat查看数据库密码 主要是怕作者删帖,因此备份 开始 1.导出链接 2.一定 ...

  9. Maven配置代理

    Maven配置代理 找到settings.xml文件: 通常位于Maven安装目录下的conf文件夹中.或者位于用户目录下的.m2文件夹中(例如:$HOME/.m2/settings.xml). 编辑 ...

  10. mac 安装ActiveMQ

    1.http://activemq.apache.org/activemq-5154-release.html 选gz 2.cd apache-activemq-5.15.4/bin/macosx 3 ...