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根目录文件中,导致读取不到。

相关推荐
yaoxin5211231 小时前
462. Java 反射 - 获取声明类与封闭类
java·开发语言·python
阿里嘎多学长1 小时前
2026-07-14 GitHub 热点项目精选
开发语言·程序员·github·代码托管
charlie1145141912 小时前
Cinux: 为大内核铺路
开发语言·c++·操作系统·现代c++
2501_914245932 小时前
C语言设计模式详解:从理论到实践的完整指南
c语言·开发语言·设计模式
Hazenix3 小时前
Go 指南:一篇文章速通 Golang
开发语言·后端·golang
灯澜忆梦3 小时前
GO_复合类型---指针
开发语言·后端·golang
Ulyanov3 小时前
雷达导引头Python仿真框架:GPU加速、6-DOF模型与半实物仿真接口
开发语言·python·雷达信号处理·雷达导引头
wuqingshun3141593 小时前
MYSQL的乐观锁和悲观锁是什么?
java
唐青枫4 小时前
Java SLF4J 实战指南:从日志门面到 Logback、MDC 和链路追踪
java
名字还没想好☜4 小时前
Go slice 的 append 陷阱:共享底层数组导致的数据串改
开发语言·后端·golang·go·slice