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

相关推荐
恋恋西风2 小时前
C++ 理解 std::thread 在单核和多核上的行为差异
开发语言·c++
学长毕业设计2 小时前
基于SpringBoot的公益基金管理系统(源码+文档+讲解视频)
java·spring boot·后端
Brilliantwxx2 小时前
【Linux】 进程(9)程序与进程地址空间(基础+进阶+面试题)
linux·运维·服务器·开发语言·c++
东小西2 小时前
【SAA实战】第 3 篇 · 工具调用全攻略:把业务能力交给 Agent 自己调度
java·后端·spring
东小西3 小时前
【SAA实战】第 4 篇 · Agent 短期记忆:saver 让 Agent 跨轮记得住(threadId 隔离)
java·后端·spring
许彰午3 小时前
22-DataCenter报文序列化
java·低代码·架构·状态模式
2601_962065253 小时前
[MySQL] SQL优化之性能分析
java·sql·mysql
BizzZ_3 小时前
C++(22)——类型转换和IO流
开发语言·c++
小范同学_3 小时前
JDK1.7 与 JDK1.8 HashMap 底层原理对比 + 数组并发扩容死循环详解
java·开发语言
geovindu4 小时前
CSharp: 万年历
开发语言·后端·c#·.net