[源码系列:手写spring] IOC第四节:Bean属性注入
主要内容
添加PropertyValue类表示Bean的属性。
为Bean定义对象BeanDefinition添加PropertyValues列表用来存储Bean的各种属性。
Bean实例化时根据PropertyValues填充属性。
代码分支
核心代码
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属性注入的更多相关文章
- Spring源码分析 手写简单IOC容器
Spring的两大特性就是IOC和AOP. IOC Container,控制反转容器,通过读取配置文件或注解,将对象封装成Bean存入IOC容器待用,程序需要时再从容器中取,实现控制权由程序员向程序的 ...
- 《四 spring源码》手写springioc框架
手写SpringIOCXML版本 /** * 手写Spring专题 XML方式注入bean * * * */ public class ClassPathXmlApplicationContext { ...
- 框架源码系列十:Spring AOP(AOP的核心概念回顾、Spring中AOP的用法、Spring AOP 源码学习)
一.AOP的核心概念回顾 https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/core.html#a ...
- 曹工说Spring Boot源码(27)-- Spring的component-scan,光是include-filter属性的各种配置方式,就够玩半天了.md
写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...
- 从零开始手写 spring ioc 框架,深入学习 spring 源码
IoC Ioc 是一款 spring ioc 核心功能简化实现版本,便于学习和理解原理. 创作目的 使用 spring 很长时间,对于 spring 使用非常频繁,实际上对于源码一直没有静下心来学习过 ...
- 框架源码系列六:Spring源码学习之Spring IOC源码学习
Spring 源码学习过程: 一.搞明白IOC能做什么,是怎么做的 1. 搞明白IOC能做什么? IOC是用为用户创建.管理实例对象的.用户需要实例对象时只需要向IOC容器获取就行了,不用自己去创建 ...
- 《四 spring源码》手写springmvc
手写SpringMVC思路 1.web.xml加载 为了读取web.xml中的配置,我们用到ServletConfig这个类,它代表当前Servlet在web.xml中的配置信息.通过web.xml ...
- Spring源码 20 手写模拟源码
参考源 https://www.bilibili.com/video/BV1tR4y1F75R?spm_id_from=333.337.search-card.all.click https://ww ...
- 利用递归,反射,注解等,手写Spring Ioc和Di 底层(分分钟喷倒面试官)了解一下
再我们现在项目中Spring框架是目前各大公司必不可少的技术,而大家都知道去怎么使用Spring ,但是有很多人都不知道SpringIoc底层是如何工作的,而一个开发人员知道他的源码,底层工作原理,对 ...
- Spring源码剖析3:Spring IOC容器的加载过程
本文转自五月的仓颉 https://www.cnblogs.com/xrq730 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https ...
随机推荐
- 【Java并发编程线程池】 ForkJoinPool 线程池是什么 怎么工作的 和传统的ThreadPoolExecutor比较
Java 中的 ForkJoinPool 线程池是什么 怎么工作的 Java 中的 ForkJoinPool 线程池是什么 怎么工作的 相比较于传统的线程池,ForkJoinPool 线程池更适合处理 ...
- Solution Set - 多项式杂题
0. 「OurOJ #46942」/「51nod #1824」染色游戏 Private link & Submission. 首先,显然有 \[f(t)=\sum_{i=0}^t\bi ...
- 第四五章 (Nginx+Lua)Lua模块开发
在实际开发中,不可能把所有代码写到一个大而全的lua文件中,需要进行分模块开发:而且模块化是高性能Lua应用的关键.使用require第一次导入模块后,所有Nginx 进程全局共享模块的数据和代码,每 ...
- C# 开发工具Visual Studio 介绍
Visual Studio Community (社区版) 这个版本的 Visual Studio 是免费的,具备以前 Professional 版的功能.使用时间有许可限制.它对开源项目和培训.学术 ...
- c++:-0
了解 特征 1.继承 2.多态 打球:打乒乓球.打篮球 3.封装 例: class Clock { public: void setTime(int newH, int newM, int newS) ...
- args = parser.parse_args()报错 解决
args = parser.parse_args()报错 解决 问题: 如题. 解决方法: args = parser.parse_args(args=[]) args = parser.parse_ ...
- Spring常用注解介绍
在Spring中,有许多高效的注解,其简化了开发并提高代码可读性,这样我们就不用再去spring.xml文件中写标签了非常方便 创建对象的注解 在Spring,有用于识别不同类型的Bean,使得Spr ...
- 一种Mysql和Mongodb数据同步到Elasticsearch的实现办法和系统
本文分享自天翼云开发者社区<一种Mysql和Mongodb数据同步到Elasticsearch的实现办法和系统>,作者:l****n 核心流程如下: 核心逻辑说明: MySQL Binlo ...
- IPTools for .NET:快速查询全球IP信息
IPTools 是一个用于快速查询全球 IP 地址信息的库,支持国内和国际 IP 查询,提供详细的地理位置信息(如国家.省份.城市)以及经纬度等数据. 1. IPTools.China IPTools ...
- CH340区别
CH340区别 CH340G USB转串⼝,推出时间最早,需外挂晶振,应⽤最⼴SOP16 CH340C USB转串⼝,内置晶振,引脚兼容CH340G SOP16 CH340E USB转串⼝,内置 ...