文档章节

手写spring IOC 框架

jason_kiss
 jason_kiss
发布于 2017/08/31 13:20
字数 725
阅读 66
收藏 2

什么是springICO?

就是把每一个bean(实体类) 与其他bean(实体类)的关系 交给第三方容器去管理

springICO底层实现原理?

1.读取beanXML配置文件(读取配置文件)

2.使用beanId查找bean配置,并获取配置文件中class地址。

3.使用Java反射技术实例化对象

4.获取属性配置,使用反射技术进行赋值。

详细步骤

1.利用传入的参数获取xml文件的流,并且利用dom4j解析成Document对象

2.对于Document对象获取根元素对象<beans>后对下面的<bean>标签进行遍历,判断是否有符合的id.

3.如果找到对应的id,相当于找到了一个Element元素,开始创建对象,先获取class属性,根据属性值利用反射建立对象.

4.遍历<bean>标签下的property标签,并对属性赋值.

注意,需要单独处理int,float类型的属性.因为在xml配置中这些属性都是以字符串的形式来配置的,因此需要额外处理.

5.如果属性property标签有ref属性,说明某个属性的值是一个对象,那么根据id(ref属性的值)去获取ref对应的对象,再给属性赋值.

6.返回建立的对象,如果没有对应的id,或者<beans>下没有子标签都会返回null

环境准备:

XML

    建好两个实体类 一个XML

   

package com.cheng.MavenTest;

import java.lang.reflect.Field;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import com.cheng.entity.Tearchers;

public class Aplication {
	private String xmlPath;
	//配置文件
	public Aplication(String xmlPath){
		this.xmlPath=xmlPath;
	}
	//获取bean
	public Object getBeans(String beanId) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException{
		//解析XML
		SAXReader xaxReader=new SAXReader();
		Document document=null;
		try {
			//从根目录下读取
			document=xaxReader.read(this.getClass().getClassLoader().getResourceAsStream(xmlPath));
			
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		//读取根节点信息
		Element element=document.getRootElement();
		//得到跟节点数组
		List<Element> list=element.elements();
		if (list.size()<=0){
			
			return null;
		}
		Object o=null;
		//遍历根节点
		for (Element element2 : list) {
			String id=element2.attributeValue("id");
			if(id.isEmpty()){
				
				return null;
			}
			if(!id.equals(beanId)){
				continue;
				
			}
			//获取类的路径
			String classBeans=element2.attributeValue("class");
			
			Class<?>  forName=Class.forName(classBeans);
			
			o=forName.newInstance();
			
			//赋值
			List<Element> list2=element2.elements();
			if(list2.size()<=0){
				
				return null;
			}
			for (Element element3 : list2) {
				String name=element3.attributeValue("name");
				String value=element3.attributeValue("value");
				Field file = forName.getDeclaredField(name);
				//设置允许访问私有变量
				file.setAccessible(true);
				file.set(o, value);
			}
		}
		return o;
	}
	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException {
		Aplication aplication = new Aplication("SpringIOC.xml");
		
		Tearchers tearchers=(Tearchers) aplication.getBeans("tearChers");
		
		System.out.println(tearchers.getTearName());
		System.out.println(tearchers.getTrarAge());
	}
}

 打印结果:

 

注意:需要单独处理int,float类型的属性.因为在xml配置中这些属性都是以字符串的形式来配置的,因此需要额外处理.

  比如:我这里访问另外一个类

    

解决办法:

根据类型判断,这里只列出了 Integer 类型还有很多类型可以自己匹配!

另外这里只是注入属性,那么注入对象呢?

  

有什么问题可以在加QQ群:600922504

一起探讨技术。

© 著作权归作者所有

共有 人打赏支持
jason_kiss
粉丝 11
博文 92
码字总数 51973
作品 0
浦东
程序员
私信 提问
我是这样手写Spring的,麻雀虽小五脏俱全

人见人爱的Spring已然不仅仅只是一个框架了。如今,Spring已然成为了一个生态。但深入了解Spring的却寥寥无几。这里,我带大家一起来看看,我是如何手写Spring的。我将结合对Spring十多年的研...

JAVA高级架构v
10/29
0
0
三流程序员与一流程序员之间的区别,看看你是属于哪一类?

源码系列 手写spring mvc框架 基于Spring JDBC手写ORM框架 实现自己的MyBatis Spring AOP实战之源码分析 Spring IOC高级特性应用分析 ORM框架底层实现原理剖析 手写Spring MVC框架实现 手把手...

茶轴的青春
04/17
0
0
Java开发者不会这些永远都只能是三流程序员,细数一下你是不是?

源码系列 手写spring mvc框架 基于Spring JDBC手写ORM框架 实现自己的MyBatis Spring AOP实战之源码分析 Spring IOC高级特性应用分析 ORM框架底层实现原理剖析 手写Spring MVC框架实现 手把手...

美的让人心动
04/16
0
0
自己手写一个Spring MVC框架

想要了解Spring MVC框架的原理,探究框架是如何设计的,不错的学习方式是阅读源码,然后自己手写一个框架。本文带领大家简化的手写一个Spring MVC框架。 Spring框架对于Java后端程序员来说再...

技术小能手
08/01
0
0
Spring Framework 源码阅读+吐槽

吐槽 有人说JAVA企业级应用没啥技术含量,玩不了大数据的技术人员是很杯具的存在。大部分生命的时间是处理复杂的业务,沉迷于一堆框架和API的应用,却没有足够的能力去解决计算机世界里面高深的...

geecoodeer
2014/01/09
0
7

没有更多内容

加载失败,请刷新页面

加载更多

阿里云建站

阿里云自营建站 没想到阿里云已经切入这块市场了。可以用拖动的方式来建站的模式,真的还是6.

miaojiangmin
24分钟前
2
0
linux系统top命令:virt,res,shr详解

VIRT:virtual memory usage 虚拟内存 1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等 2、假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用...

刘祖鹏
30分钟前
2
0
day154-2018-11-21-英语流利阅读-待学习

快手网红发明家:百万粉丝 vs 零销量 雪梨 2018-11-21 1.今日导读 “我做了一个‘雷神锤’的斜挎包,你看这里可以打开,里面可以装手机、卫生纸、钱包,觉得轻的话可以放一些砖头。咱们把它背...

飞鱼说编程
36分钟前
10
0
图灵奖得主华人高徒发布AI芯片!64位RISC-V、高度可编程,低功耗

作为RISC-V架构下的旗手玩家,睿思芯科自然希望通过产品展现出RISC-V可编程架构的巨大潜力。 https://mbd.baidu.com/newspage/data/landingshare?context=%7B%22nid%22:%22news_917924603675...

whoisliang
37分钟前
4
0
xcode 10 缺少 libstdc++6.0.9 解决方案

image.png 本方案基于xcode10正式版操作,其它版本请自行验证! 苹果在XCode10中移除了libstdc++(libstdc++.6、libstdc++6.0.9)库。 项目解决方法:删除libstdc++(libstdc++.6、libstdc++6....

壹峰
41分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部