Spring组件扫描原理 - 基础版

achong
2023-03-03 / 0 评论 / 16 阅读 / 正在检测是否收录...

以下代码只是基本的组件扫描功能。

全是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);

    }

spring组件扫描原理运行结果.png

0

评论 (0)

取消
粤ICP备18061175号-3