JavaEE企业开发新技术4

2.16 模拟Spring IOC容器功能-1

2.17 模拟Spring IOC容器功能-2

什么是IOC?

  1. 控制反转,把对象创建和对象之间的调用过程交给Spring框架进行管理
  2. 使用IOC的目的:为了耦合度降低
解释:

模仿 IOC容器的功能,我们利用 Map 集合存放需要的对象,并新建一个 conf.properties 文件存放信息,在获取 对象 之前解析 ioc.properties 文件中的信息,利用反射技术将 conf.properties 文件中的内容通过 Class.forName 的形式解析为 Class 对象放入集合 map 中,这样每次获取对象都会从 map 中进行获取,不需要再 new

Ioc.properties类:

java 复制代码
clazz1=cn.edu.xync.myweb.reflect.Person
clazz2=cn.edu.xync.myweb.reflect.Teacher

IOCContainer类:

java 复制代码
package cn.edu.xync.myweb.util;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

public class IOCContainer {
	//用来存放配置文件读取通过反射所创建的对象
	private Map<String,Object> container=new HashMap<String,Object>();

	public void init() {//读取配置文件
		InputStream is=IOCContainer.class.getClassLoader().getResourceAsStream("ioc.properties");//通过当前类的字节码加载器去读取ioc.properties文件,以InputStream类型保存


		
		Properties p=new Properties();
		try {
			p.load(is);//加载文件
			
			Set<String> propertyNames=p.stringPropertyNames();//返回配置文件中所有属性的名称
			
			Iterator<String> its=propertyNames.iterator();//迭代器遍历
			while(its.hasNext()) {
				String key=its.next();
				String value=p.getProperty(key);//通过key值拿到value,拿到value的目的时通过反射创建对象
				//通过反射创建出对象后,添加到Map中
				container.put(key,Class.forName(value).newInstance());//通过无参数的构造方法以反射形式创建对象
				
				}
			}
			catch (InstantiationException e) {
				System.err.println("通过配置文件创建对象错误,请检查类完整的包路径名称和类名称是否正确");
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		 catch (IOException e) {
			System.err.println("读取配置文件错误,请检查文件名称或者路径是否正确");
			e.printStackTrace();
		}
	}
	
	public void showElements() {
		Set<String> keys=container.keySet();//得到Map中所有key组成的Set
		
		Iterator<String> its=keys.iterator();
		while(its.hasNext()) {
			String key=its.next();
			Object value=container.get(key);
			System.out.println("key:"+key+",value:"+value);
		}
	}
	
	public static void main(String[] args) {
		IOCContainer con=new IOCContainer();
		con.init();//初始化容器
		con.showElements();
	}
}

运行结果:

总结:

通过简单的模拟ioc容器功能,再次理解ioc容器,即"控制反转",不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制,对于spring框架来说,就是由Spring来负责控制对象的生命周期和对象间的关系。

错误:

原因:is这个输入流是空的。加载器没有读取到我的配置文件,因为我没有将ioc.properties放在src根目录文件中,导致读取不到。

相关推荐
IKUN家族1 小时前
Spring MVC(一)
java·spring·mvc
老马识途2.02 小时前
关于跨域问题的总结
java·前端
魔力女仆3 小时前
分享一个 JS 鼠标跟随贪吃蛇背景库
开发语言·javascript·计算机外设
都叫我大帅哥3 小时前
Java日期时间三十年战争:从Date考古到LocalDateTime革命,以及数据库与前端的那点事儿
java
Muscleheng3 小时前
SpringBoot 集成 DeepSeek 实现 RAG 文档问答
java·spring boot·ai·springai
2401_894915533 小时前
GEO 搜索优化完整源码从零部署:环境配置、集群搭建全流程
开发语言·python·tcp/ip·算法·unity
2501_936415694 小时前
可变参数&综合练习&斗地主游戏
java·windows·游戏
麻瓜老宋4 小时前
AI开发C语言应用按步走,表达式计算器calc的第二十二步,分号赋值链式修复、TOKEN_ASSIGN
c语言·开发语言·atomcode
极客先躯5 小时前
高级java每日一道面试题-2026年05月03日-实战篇[Docker]-如何实现容器化环境的数据加密?
java·运维·docker·容器·金融·加解密·高级面试
xqqxqxxq5 小时前
Java Socket 多人聊天室(私聊+群聊)技术笔记(V4版本)
java·网络·笔记