开始之前我们先要清楚一个事IOC容器是干什么用的,IOC容器是控制对象的生成,维护对象之间的关系。在不适用IOC容器时我们使用对象,比如A需要B对象上的show方法,是在A对象中持有B对象的实例然后再调用它上面的show方法。而采用IOC容器我们可以结合注解使用
扫描包的工具类
package cn.yc.myspring.ioc.utils;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/***
* 扫描包下类的工具类
*/
public abstract class ScannerClass {
/***
**参数1 要扫描包的完整路径 要扫描包的名称(cn.itcast.manage)
**返回参数 该包下面所有的类的全名称
**/
public static List<String> parseClassName(String packageName) {
List<String> array = new ArrayList<>();
String packagePath = resovlePackagePath(packageName);
File root = new File(packagePath);
resolveFile(root, packageName, array);
return array;
}
/***
**参数 包名(cn.itcast.manage)
**返回参数 该包的全路径
**/
private static String resovlePackagePath(String packageName) {
//扫码所有的包并把其放入到访问关系和方法放入到内存中
File f = new File(ScannerClass.class.getResource("/").getPath());
String totalPath = f.getAbsolutePath();
String pageName = ScannerClass.class.getPackage().getName().replace(".","\\");
totalPath = totalPath.replace(pageName,"");
String packagePath = packageName.replace(".","\\");
totalPath=totalPath+"\\"+packagePath;
return totalPath;
}
private static void resolveFile(File root, String packageName, List<String> classNames) {
if (!root.exists())
return;
File[] childs = root.listFiles();
if (childs != null && childs.length > 0) {
for (File child : childs) {
if (child.isDirectory()) {
String parentPath = child.getParent();
String childPath = child.getAbsolutePath();
String temp = childPath.replace(parentPath, "");
temp = temp.replace("\\", "");
resolveFile(child, packageName + "." + temp, classNames);
} else {
String fileName = child.getName();
if (fileName.endsWith(".class")) {
String name = fileName.replace(".class", "");
String className = packageName + "." + name;