项目实战:组件扫描(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 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 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

 项目实战:组件扫描(2)-获取bean组件存放到IOC容器_第1张图片

你可能感兴趣的:(#,IOC_MVC,java,substring,replaceAll,startsWith,isAbstract,getModifiers,stream)