模拟IOC的实现
1.1什么是IOC
IOC即控制反转,而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转.
1.2 IOC底层原理使用技术
(1)xml配置文件
(2)dom4j解决xml
(3)工厂设计模式
(4)反射Class.forName(classPath).newInstance();
1.3IOC底层实现的步骤
- 创建容器管理bean,并初始化容器
- 创建spring容器,并初始化容器
- 提供getBean(),根据bean的名字,从spring容器中获取对应的对象
1.3.1 定义Bean
用来封装bean的名字和路径
package cn.tedu.design;
//模拟spring管理bean,存放bean
public class Bean {
private String name;//bean名字-> hello
private String path;//bean对应的类路径->cn.tedu.desing.Hello
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
}
1.3.2 初始化spring容器
spring的容器的主要功能是创建对象并管理对象的生命周期,关键点是如何创建对象(java反射技术)
package cn.tedu.design;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
//模拟spring框架,是spring的核心
//1,创建容器管理bean-> [user,dept,hello]
//2,创建spring容器-> {hello=new Hello(),user=new Uer() }
//3,getBean(),有就直接取出来,没有就创建并放入容器
public class SpringContext {
//1,创建容器管理bean-> [user,dept,hello]
private List<Bean> beanFactory = new ArrayList<>();
//初始化容器
public SpringContext() throws Exception {
//创建Bean,并加入容器中
Bean bean = new Bean();
bean.setName("hello");
bean.setPath("cn.tedu.pojo.Hello");
beanFactory.add(bean);
init();
}
//2,创建spring容器-> {hello=new Hello(),user=new Uer() } //并发安全的map
private final Map<String, Object> factoryBeanObject = new ConcurrentHashMap<>();
//初始化spring容器-> {hello=new Hello(),user=new Uer() }
public void init() throws Exception {
//遍历beanFactory,得到每个bean
for(Bean b : beanFactory) {
//map里的key
String key = b.getName();
//反射创建对象,作为value存入map
String path = b.getPath();
Object value = Class.forName(path).newInstance();
factoryBeanObject.put(key, value);
}
}
//3,getBean()有就直接取出来,没有就创建并放入容器
public Object getBean(String name) {
return factoryBeanObject.get(name);//去map里根据key找value
}
}
1.3.3 准备一个Hello类用于测试
package spring;
public class Hello {
public void hi() {
System.out.println("hi springioc");
}
}
1.3.4 测试
package cn.tedu.spring;
import cn.tedu.design.SpringContext;
import cn.tedu.pojo.Hello;
public class TestMyIOC {
public static void main(String[] args) throws Exception {
SpringContext spring = new SpringContext();
Hello o = (Hello)spring.getBean("hello");
System.out.println(o);//cn.tedu.pojo.Hello@6d06d69c
o.hi();
}
}