模拟springIOC的底层实现

本文详细介绍了控制反转(IoC)的基本概念,包括其工作原理和底层技术应用,如XML配置、DOM4J解析、工厂模式与反射。通过实例展示了如何使用模拟的Spring Context管理Bean,创建Bean并使用getBean方法获取对象。重点在于Spring容器的创建与Hello类的测试。
摘要由CSDN通过智能技术生成

模拟IOC的实现

1.1什么是IOC

IOC即控制反转,而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转.

1.2 IOC底层原理使用技术

(1)xml配置文件

(2)dom4j解决xml

(3)工厂设计模式

(4)反射Class.forName(classPath).newInstance();

1.3IOC底层实现的步骤

  1. 创建容器管理bean,并初始化容器
  2. 创建spring容器,并初始化容器
  3. 提供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();
	}
}


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诗人在流浪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值