以下代码只是基本的组件扫描功能。
全是Java的基础知识。
类加载器、反射、注解、文件和文件夹操作、String的处理、集合。
public static void main(String[] args) {
Map<String, Object> beanMap = new HashMap<>();
// 1、需要扫描的目录
String packageName = "cn.qqwer.achong.IOC.bean";
// 2、将包名转换为路径格式
String packagePath = packageName.replaceAll("\\.","/"); // cn/qqwer/achong/IOC/bean
// 3、通过系统加载器获取本地资源路径,返回一个URL对象
URL url = ClassLoader.getSystemClassLoader().getResource(packagePath);
// 4、得到绝对路径
String path = url.getPath();
// 5、根据绝对路径得到file对象
File file = new File(path);
// 6、获取路径下的所有类文件,获得数组
File[] files = file.listFiles();
// 7、开始逐个处理
Arrays.stream(files).forEach(f -> {
// 8、拼接类文件的全包名
String className = packageName + "." +f.getName().split("\\.")[0]; // cn.qqwer.achong.IOC.bean.User
try {
// 9、根据类的全路径,获取类本身
Class<?> aClass = Class.forName(className);
// 10、判断此类是否标记Component注解
if (aClass.isAnnotationPresent(Component.class)){
Component annotation = aClass.getAnnotation(Component.class);
// 11、如果有注解、再继续判断@Component是否有值,即是否为bean设置ID
String id = annotation.value();
if ("".equals(annotation.value())){
String simpleName = aClass.getSimpleName();
// 12、如果没为bean设置id,则将类文件名设置为bean的ID,类名首字母需转小写
if (!Character.isLowerCase(simpleName.charAt(0))){
id = new StringBuilder().append(Character.toLowerCase(simpleName.charAt(0))).append(simpleName.substring(1)).toString();
}
}
// 13、最好,将对象new出,并放到一个Map中。
Object obj = aClass.newInstance();
beanMap.put(id, obj);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
});
//输出map查看结果
System.out.println(beanMap);
}