java ioc 简单实现原理_Spring容器的简单实现(IOC原理)

引言:容器是什么?什么是容器?Spring容器又是啥东西?我给Spring容器一个对象名字,为啥能给我创建一个对象呢?

一、容器是装东西的,就像你家的水缸,你吃饭的碗等等。

java中能作为容器的有很多,例如Map,List,数组.....还有好多

二、Spring 容器的核心就是一个Map集合(可能不是很准确,见谅!)

Map 这个容器里根据key-value存放了好多键值对。假如你给一个String的key,就能获得相应的Object的对象,各位大佬,对Spring容器是不是有拨开云雾见太阳的感觉了?[/斜眼笑]

Spring工厂的作用:帮助我们创建管理对象。

BeanFactory

1、定义Map容器,key-类名、value-对象

2、解析bean.xml文件

3、根据name返回对象

1 packagecom.demo.ioc.theory.factory;2

3 importjava.util.Map;4

5 importcom.demo.ioc.theory.util.ParseHelper;6

7 public classBeanFactory {8 //定义的Map的容器

9 private Mapmap;10 //无参构造器传的是bean.xml文件的路径

11 publicBeanFactory() {12 this("src/bean.xml");13 }14 //这个构造器调用方法解析xml文件,返回值就是 类名-对象 的关系

15 publicBeanFactory(String path) {16 try{17 map =ParseHelper.parseXml(path);18 } catch(Exception e) {19 e.printStackTrace();20 }21 }22 //根据类名获取对象的方法

23 publicObject getBean(String beanName) {24 returnmap.get(beanName);25 }26 }

解析bean.xml文件(dom4j解析)

需要导入dom4j的相关jar包,下载地址  http://central.maven.org/maven2/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar

这个解析简单,直接上代码:

packagecom.demo.ioc.theory.util;importjava.io.File;importjava.lang.reflect.Method;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importorg.dom4j.Document;importorg.dom4j.Element;importorg.dom4j.io.SAXReader;

@SuppressWarnings("unchecked")public classParseHelper {public static Map parseXml(String path) throwsException {

Map map = new HashMap<>();//创建saxReader对象

SAXReader saxReader = newSAXReader();//通过read方法读取一个文件 转换成Document对象

Document document = saxReader.read(newFile(path));//获取根节点元素对象

Element rootElement =document.getRootElement();

List elements =rootElement.elements();for(Element e:elements){

String beanName= e.attributeValue("name");

String className= e.attributeValue("class");

Object o=Class.forName(className).newInstance();

map.put(beanName,o);

List elements2 =e.elements();for(Element e2:elements2){//

String propertyName = e2.attributeValue("name");

String refName= e2.attributeValue("ref");//调用当前类中的一个私有方法 通过参数student获得其对应的set方法名:setStudent

String methodName =getMethodName(propertyName);//通过对象名字stu从map中获得其对应的对象

Object obj =map.get(refName);//获得setStudent方法镜像

Method method = o.getClass().getMethod(methodName, newClass[]{obj.getClass()});//反射调用该方法 相当于 t.setStudent(stu);

method.invoke(o, obj);

}

}returnmap;

}//可以把字符串参数xxx转变为setXxx

private staticString getMethodName(String s) {

s= s.substring(0,1).toUpperCase() + s.substring(1,s.length());return "set"+s;

}

}

配置文件bean.xml文件

实体类,Student.java

package com.demo.ioc.theory.bean;

public class Student {

private String name;

private String age;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getAge() {

return age;

}

public void setAge(String age) {

this.age = age;

}

}

测试自己做的IOC容器

packagecom.demo.ioc.theory;importcom.demo.ioc.theory.bean.Student;importcom.demo.ioc.theory.factory.BeanFactory;public classIocTest {public static voidmain(String[] args) {//创建工厂对象

BeanFactory beanFactory = newBeanFactory();//通过工厂直接拿到Student对象,不用去 new Student();

Student bean = (Student) beanFactory.getBean("student");//测试

bean.setAge("20");

System.out.println(bean.getAge());

}

}

到此,一个简单的Spring Ioc容器就实现了,这个容器可以根据配置文件配置的信息获取到对应的对象。不需要再去new对象了。当然,这只是最简单的,你也可以再去深入....

下面是我的demo的项目结构,瞧一瞧哦

0d825a430bf1e12933bd01034ffccfad.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值