项目实战:组件扫描(2)-获取bean组件存放到IOC容器

1、ComponentScan

package com.csdn.mymvc.core;
import com.csdn.mymvc.annotation.Controller;
import com.csdn.mymvc.annotation.Repository;
import com.csdn.mymvc.annotation.Service;
import java.io.File;
import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
public class ComponentScan {
    public static Map<String, Object> beanFactory = new HashMap<>();
    static String path = null;
    static {
        //分析文件夹
        path = ComponentScan.class.getClassLoader().getResource("").getPath();
        //  /F:/IdeaProjects/workspace/review/pro13-fruit-DispatcherServlet/target/pro13-fruit-DispatcherServlet-1.0-SNAPSHOT/WEB-INF/classes/
        //计算机的硬盘根目录是 / ,不论是什么操作系统。只是微软人为的分出盘符的概念
        //System.out.println(path);
        path = path.substring(1);
        //   F:/IdeaProjects/workspace/review/pro13-fruit-DispatcherServlet/target/pro13-fruit-DispatcherServlet-1.0-SNAPSHOT/WEB-INF/classes/
        File rootDir = new File(path);
        //开始解析文件夹 - 组件扫描工作开始
        try {
            parseFile(rootDir);

            System.out.println(beanFactory);

        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }
    private static void parseFile(File file) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        if (file.exists()) {
            if (file.isDirectory()) {
                //获取所有的子目录
                File[] childFiles = file.listFiles();
                for (File childFile : childFiles) {
                      parseFile(childFile);
                }
            } else {
                String absPath = file.getAbsolutePath();
                //System.out.println(absPath);
                String fullClassPath = absPath.substring(path.length());
                //System.out.println(fullClassPath);
                if (fullClassPath.endsWith(".class")) {
                    String fullClassPathName = fullClassPath.substring(0, fullClassPath.length() - ".class".length());
                    //System.out.println(fullClassPathName);
                    String fullClassName = fullClassPathName.replaceAll("\\\\", ".");
                    //System.out.println(fullClassName);
                    Class<?> clazz = Class.forName(fullClassName);
                    if (clazz.toString().startsWith("class")) {  //排除掉接口、注解....,只关心class
                        if (!Modifier.isAbstract(clazz.getModifiers())) {   //排除掉抽象类

                            Optional<Annotation> optional = Arrays.stream(clazz.getDeclaredAnnotations()).filter(annotation -> {
                                return (annotation instanceof Controller || annotation instanceof Service || annotation instanceof Repository);
                            }).findFirst();

                            if (!optional.isEmpty()) {
                                Object bean = clazz.getDeclaredConstructor().newInstance();
                                beanFactory.put(fullClassName, bean);
                            }
                        }
                    }
                }
            }
        }
    }
}

 2、path = ComponentScan.class.getClassLoader().getResource("").getPath()

/F:/IdeaProjects/workspace/review/pro13-fruit-DispatcherServlet/target/pro13-fruit-DispatcherServlet-1.0-SNAPSHOT/WEB-INF/classes/

 3、 path = path.substring(1)

F:/IdeaProjects/workspace/review/pro13-fruit-DispatcherServlet/target/pro13-fruit-DispatcherServlet-1.0-SNAPSHOT/WEB-INF/classes/

 4、String absPath = file.getAbsolutePath()

F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\fruit\dao\FruitDao.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\fruit\dao\impl\FruitDaoImpl.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\fruit\dto\PageInfo.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\fruit\dto\PageQueryParam.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\fruit\dto\Result.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\fruit\service\FruitService.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\fruit\service\impl\FruitServiceImpl.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\fruit\servlet\FruitController.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\fruit\util\GsonUtil.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\fruit\util\RequestUtil.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\fruit\util\ResponseUtil.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\mymvc\annotation\Autowire.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\mymvc\annotation\Controller.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\mymvc\annotation\GetMapping.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\mymvc\annotation\PostMapping.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\mymvc\annotation\Repository.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\mymvc\annotation\RequestMapping.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\mymvc\annotation\Service.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\mymvc\core\ComponentScan.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\mymvc\core\DispatcherServlet.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\mymvc\listener\ContextLoaderListener.class

 5、String fullClassPath = absPath.substring(path.length())

com\csdn\fruit\dao\FruitDao.class
com\csdn\fruit\dao\impl\FruitDaoImpl.class
com\csdn\fruit\dto\PageInfo.class
com\csdn\fruit\dto\PageQueryParam.class
com\csdn\fruit\dto\Result.class
com\csdn\fruit\service\FruitService.class
com\csdn\fruit\service\impl\FruitServiceImpl.class
com\csdn\fruit\servlet\FruitController.class
com\csdn\fruit\util\GsonUtil.class
com\csdn\fruit\util\RequestUtil.class
com\csdn\fruit\util\ResponseUtil.class
com\csdn\mymvc\annotation\Autowire.class
com\csdn\mymvc\annotation\Controller.class
com\csdn\mymvc\annotation\GetMapping.class
com\csdn\mymvc\annotation\PostMapping.class
com\csdn\mymvc\annotation\Repository.class
com\csdn\mymvc\annotation\RequestMapping.class
com\csdn\mymvc\annotation\Service.class
com\csdn\mymvc\core\ComponentScan.class
com\csdn\mymvc\core\DispatcherServlet.class
com\csdn\mymvc\listener\ContextLoaderListener.class

6、String fullClassPathName = fullClassPath.substring(0, fullClassPath.length() - ".class".length())

com\csdn\fruit\dao\FruitDao
com\csdn\fruit\dao\impl\FruitDaoImpl
com\csdn\fruit\dto\PageInfo
com\csdn\fruit\dto\PageQueryParam
com\csdn\fruit\dto\Result
com\csdn\fruit\service\FruitService
com\csdn\fruit\service\impl\FruitServiceImpl
com\csdn\fruit\servlet\FruitController
com\csdn\fruit\util\GsonUtil
com\csdn\fruit\util\RequestUtil
com\csdn\fruit\util\ResponseUtil
com\csdn\mymvc\annotation\Autowire
com\csdn\mymvc\annotation\Controller
com\csdn\mymvc\annotation\GetMapping
com\csdn\mymvc\annotation\PostMapping
com\csdn\mymvc\annotation\Repository
com\csdn\mymvc\annotation\RequestMapping
com\csdn\mymvc\annotation\Service
com\csdn\mymvc\core\ComponentScan
com\csdn\mymvc\core\DispatcherServlet
com\csdn\mymvc\listener\ContextLoaderListener

7、String fullClassName = fullClassPathName.replaceAll("\\\\", ".")

com.csdn.fruit.dao.FruitDao
com.csdn.fruit.dao.impl.FruitDaoImpl
com.csdn.fruit.dto.PageInfo
com.csdn.fruit.dto.PageQueryParam
com.csdn.fruit.dto.Result
com.csdn.fruit.service.FruitService
com.csdn.fruit.service.impl.FruitServiceImpl
com.csdn.fruit.servlet.FruitController
com.csdn.fruit.util.GsonUtil
com.csdn.fruit.util.RequestUtil
com.csdn.fruit.util.ResponseUtil
com.csdn.mymvc.annotation.Autowire
com.csdn.mymvc.annotation.Controller
com.csdn.mymvc.annotation.GetMapping
com.csdn.mymvc.annotation.PostMapping
com.csdn.mymvc.annotation.Repository
com.csdn.mymvc.annotation.RequestMapping
com.csdn.mymvc.annotation.Service
com.csdn.mymvc.core.ComponentScan
com.csdn.mymvc.core.DispatcherServlet
com.csdn.mymvc.listener.ContextLoaderListener

 8、Class<?> clazz = Class.forName(fullClassName);System.out.println(clazz.toString());

interface com.csdn.fruit.dao.FruitDao
class com.csdn.fruit.dao.impl.FruitDaoImpl
class com.csdn.fruit.dto.PageInfo
class com.csdn.fruit.dto.PageQueryParam
class com.csdn.fruit.dto.Result
interface com.csdn.fruit.service.FruitService
class com.csdn.fruit.service.impl.FruitServiceImpl
class com.csdn.fruit.servlet.FruitController
class com.csdn.fruit.util.GsonUtil
class com.csdn.fruit.util.RequestUtil
class com.csdn.fruit.util.ResponseUtil
interface com.csdn.mymvc.annotation.Autowire
interface com.csdn.mymvc.annotation.Controller
interface com.csdn.mymvc.annotation.GetMapping
interface com.csdn.mymvc.annotation.PostMapping
interface com.csdn.mymvc.annotation.Repository
interface com.csdn.mymvc.annotation.RequestMapping
interface com.csdn.mymvc.annotation.Service
class com.csdn.mymvc.core.ComponentScan
class com.csdn.mymvc.core.DispatcherServlet
class com.csdn.mymvc.listener.ContextLoaderListener

 9、if (clazz.toString().startsWith("class"))

class com.csdn.fruit.dao.impl.FruitDaoImpl
class com.csdn.fruit.dto.PageInfo
class com.csdn.fruit.dto.PageQueryParam
class com.csdn.fruit.dto.Result
class com.csdn.fruit.service.impl.FruitServiceImpl
class com.csdn.fruit.servlet.FruitController
class com.csdn.fruit.util.GsonUtil
class com.csdn.fruit.util.RequestUtil
class com.csdn.fruit.util.ResponseUtil
class com.csdn.mymvc.core.ComponentScan
class com.csdn.mymvc.core.DispatcherServlet
class com.csdn.mymvc.listener.ContextLoaderListener

 10、System.out.println(beanFactory)

{com.csdn.fruit.controller.FruitController=com.csdn.fruit.controller.FruitController@5bd018bd,
com.csdn.fruit.service.impl.FruitServiceImpl=com.csdn.fruit.service.impl.FruitServiceImpl@49414718,
com.csdn.fruit.dao.impl.FruitDaoImpl=com.csdn.fruit.dao.impl.FruitDaoImpl@82b1b65}

 11、System.out.println(beanFactory.values());

[com.csdn.fruit.controller.FruitController@6dbe343b,
com.csdn.fruit.service.impl.FruitServiceImpl@3ec06f1c,
com.csdn.fruit.dao.impl.FruitDaoImpl@75383005]

 

  • 13
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值