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

相关推荐
多米Domi0119 分钟前
0x3f 第48天 面向实习的八股背诵第五天 + 堆一题 背了JUC的题,java.util.Concurrency
开发语言·数据结构·python·算法·leetcode·面试
2301_8223776510 分钟前
模板元编程调试方法
开发语言·c++·算法
csbysj202013 分钟前
Python 循环嵌套
开发语言
测试_AI_一辰15 分钟前
Agent & RAG 测试工程05:把 RAG 的检索过程跑清楚:chunk 是什么、怎么来的、怎么被命中的
开发语言·人工智能·功能测试·自动化·ai编程
Coding茶水间18 分钟前
基于深度学习的输电电力设备检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)
开发语言·人工智能·深度学习·yolo·目标检测·机器学习
清风~徐~来22 分钟前
【视频点播系统】BRpc 介绍及使用
开发语言
啟明起鸣24 分钟前
【C++ 性能提升技巧】C++ 的引用、值类型、构造函数、移动语义与 noexcept 特性,可扩容的容器
开发语言·c++
故以往之不谏25 分钟前
函数--值传递
开发语言·数据结构·c++·算法·学习方法
今天_也很困34 分钟前
LeetCode热题100-560. 和为 K 的子数组
java·算法·leetcode