手写一个最简单的IOC容器,从而了解spring的核心原理
从事开发工作多年,spring源码没有特意去看过。但是相关技术原理倒是背了不少,毕竟面试的那关还是得过啊! 正所谓面试造火箭,工作拧螺丝。下面实现一个最简单的ioc容器,供大家参考。
1.最终结果
2.涉及相关技术
(1) jdk动态代理
(2) java反射
3.源代码
(1)包扫描工具类
package com.hdwang.ioc.core.utils; import java.io.File; import java.io.UnsupportedEncodingException; import java.net.URL; import java.net.URLDecoder; import java.util.HashSet; import java.util.Set; /** * 类工具 */ public class ClassUtils { /** * 获取某包下所有类 * * @param packageName 包名 * @param isRecursion 是否遍历子包 * @return 类的完整名称 */ public static Set<String> getClassName(String packageName, boolean isRecursion) { Set<String> classNames = new HashSet<>(); ClassLoader loader = Thread.currentThread().getContextClassLoader(); String packagePath = packageName.replace(".", "/"); URL url = loader.getResource(packagePath); String filePath = null; try { filePath = URLDecoder.decode(url.getPath(), "utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } if (filePath != null) { classNames = getClassNameFromDir(filePath, packageName, isRecursion); } return classNames; } /** * 从项目文件获取某包下有类 * * @param filePath 文件路径 * @param isRecursion 是否遍历子包 * @return 类的完整名称 */ private static Set<String> getClassNameFromDir(String filePath, String packageName, boolean isRecursion) { Set<String> className = new HashSet<>(); File file = new File(filePath); File[] files = file.listFiles(); for (File childFile : files) { if (childFile.isDirectory()) { if (isRecursion) { className.addAll(getClassNameFromDir(childFile.getPath(), packageName + "." + childFile.getName(), isRecursion)); } } else { String fileName = childFile.getName(); if (fileName.endsWith(".class") && !fileName.contains("$")) { className.add(packageName + "." + fileName.replace(".class", "")); } } } return className; } }