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


    1、ComponentScan

    1. package com.csdn.mymvc.core;
    2. import com.csdn.mymvc.annotation.Controller;
    3. import com.csdn.mymvc.annotation.Repository;
    4. import com.csdn.mymvc.annotation.Service;
    5. import java.io.File;
    6. import java.lang.annotation.Annotation;
    7. import java.lang.reflect.InvocationTargetException;
    8. import java.lang.reflect.Modifier;
    9. import java.util.Arrays;
    10. import java.util.HashMap;
    11. import java.util.Map;
    12. import java.util.Optional;
    13. public class ComponentScan {
    14. public static Map beanFactory = new HashMap<>();
    15. static String path = null;
    16. static {
    17. //分析文件夹
    18. path = ComponentScan.class.getClassLoader().getResource("").getPath();
    19. // /F:/IdeaProjects/workspace/review/pro13-fruit-DispatcherServlet/target/pro13-fruit-DispatcherServlet-1.0-SNAPSHOT/WEB-INF/classes/
    20. //计算机的硬盘根目录是 / ,不论是什么操作系统。只是微软人为的分出盘符的概念
    21. //System.out.println(path);
    22. path = path.substring(1);
    23. // F:/IdeaProjects/workspace/review/pro13-fruit-DispatcherServlet/target/pro13-fruit-DispatcherServlet-1.0-SNAPSHOT/WEB-INF/classes/
    24. File rootDir = new File(path);
    25. //开始解析文件夹 - 组件扫描工作开始
    26. try {
    27. parseFile(rootDir);
    28. System.out.println(beanFactory);
    29. } catch (ClassNotFoundException e) {
    30. throw new RuntimeException(e);
    31. } catch (InvocationTargetException e) {
    32. throw new RuntimeException(e);
    33. } catch (NoSuchMethodException e) {
    34. throw new RuntimeException(e);
    35. } catch (InstantiationException e) {
    36. throw new RuntimeException(e);
    37. } catch (IllegalAccessException e) {
    38. throw new RuntimeException(e);
    39. }
    40. }
    41. private static void parseFile(File file) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
    42. if (file.exists()) {
    43. if (file.isDirectory()) {
    44. //获取所有的子目录
    45. File[] childFiles = file.listFiles();
    46. for (File childFile : childFiles) {
    47. parseFile(childFile);
    48. }
    49. } else {
    50. String absPath = file.getAbsolutePath();
    51. //System.out.println(absPath);
    52. String fullClassPath = absPath.substring(path.length());
    53. //System.out.println(fullClassPath);
    54. if (fullClassPath.endsWith(".class")) {
    55. String fullClassPathName = fullClassPath.substring(0, fullClassPath.length() - ".class".length());
    56. //System.out.println(fullClassPathName);
    57. String fullClassName = fullClassPathName.replaceAll("\\\\", ".");
    58. //System.out.println(fullClassName);
    59. Class clazz = Class.forName(fullClassName);
    60. if (clazz.toString().startsWith("class")) { //排除掉接口、注解....,只关心class
    61. if (!Modifier.isAbstract(clazz.getModifiers())) { //排除掉抽象类
    62. Optional optional = Arrays.stream(clazz.getDeclaredAnnotations()).filter(annotation -> {
    63. return (annotation instanceof Controller || annotation instanceof Service || annotation instanceof Repository);
    64. }).findFirst();
    65. if (!optional.isEmpty()) {
    66. Object bean = clazz.getDeclaredConstructor().newInstance();
    67. beanFactory.put(fullClassName, bean);
    68. }
    69. }
    70. }
    71. }
    72. }
    73. }
    74. }
    75. }

     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()

    1. F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\fruit\dao\FruitDao.class
    2. F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\fruit\dao\impl\FruitDaoImpl.class
    3. F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\fruit\dto\PageInfo.class
    4. F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\fruit\dto\PageQueryParam.class
    5. F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\fruit\dto\Result.class
    6. F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\fruit\service\FruitService.class
    7. F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\fruit\service\impl\FruitServiceImpl.class
    8. F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\fruit\servlet\FruitController.class
    9. F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\fruit\util\GsonUtil.class
    10. F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\fruit\util\RequestUtil.class
    11. F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\fruit\util\ResponseUtil.class
    12. F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\mymvc\annotation\Autowire.class
    13. F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\mymvc\annotation\Controller.class
    14. F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\mymvc\annotation\GetMapping.class
    15. F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\mymvc\annotation\PostMapping.class
    16. F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\mymvc\annotation\Repository.class
    17. F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\mymvc\annotation\RequestMapping.class
    18. F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\mymvc\annotation\Service.class
    19. F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\mymvc\core\ComponentScan.class
    20. F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\mymvc\core\DispatcherServlet.class
    21. 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())

    1. com\csdn\fruit\dao\FruitDao.class
    2. com\csdn\fruit\dao\impl\FruitDaoImpl.class
    3. com\csdn\fruit\dto\PageInfo.class
    4. com\csdn\fruit\dto\PageQueryParam.class
    5. com\csdn\fruit\dto\Result.class
    6. com\csdn\fruit\service\FruitService.class
    7. com\csdn\fruit\service\impl\FruitServiceImpl.class
    8. com\csdn\fruit\servlet\FruitController.class
    9. com\csdn\fruit\util\GsonUtil.class
    10. com\csdn\fruit\util\RequestUtil.class
    11. com\csdn\fruit\util\ResponseUtil.class
    12. com\csdn\mymvc\annotation\Autowire.class
    13. com\csdn\mymvc\annotation\Controller.class
    14. com\csdn\mymvc\annotation\GetMapping.class
    15. com\csdn\mymvc\annotation\PostMapping.class
    16. com\csdn\mymvc\annotation\Repository.class
    17. com\csdn\mymvc\annotation\RequestMapping.class
    18. com\csdn\mymvc\annotation\Service.class
    19. com\csdn\mymvc\core\ComponentScan.class
    20. com\csdn\mymvc\core\DispatcherServlet.class
    21. com\csdn\mymvc\listener\ContextLoaderListener.class

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

    1. com\csdn\fruit\dao\FruitDao
    2. com\csdn\fruit\dao\impl\FruitDaoImpl
    3. com\csdn\fruit\dto\PageInfo
    4. com\csdn\fruit\dto\PageQueryParam
    5. com\csdn\fruit\dto\Result
    6. com\csdn\fruit\service\FruitService
    7. com\csdn\fruit\service\impl\FruitServiceImpl
    8. com\csdn\fruit\servlet\FruitController
    9. com\csdn\fruit\util\GsonUtil
    10. com\csdn\fruit\util\RequestUtil
    11. com\csdn\fruit\util\ResponseUtil
    12. com\csdn\mymvc\annotation\Autowire
    13. com\csdn\mymvc\annotation\Controller
    14. com\csdn\mymvc\annotation\GetMapping
    15. com\csdn\mymvc\annotation\PostMapping
    16. com\csdn\mymvc\annotation\Repository
    17. com\csdn\mymvc\annotation\RequestMapping
    18. com\csdn\mymvc\annotation\Service
    19. com\csdn\mymvc\core\ComponentScan
    20. com\csdn\mymvc\core\DispatcherServlet
    21. com\csdn\mymvc\listener\ContextLoaderListener

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

    1. com.csdn.fruit.dao.FruitDao
    2. com.csdn.fruit.dao.impl.FruitDaoImpl
    3. com.csdn.fruit.dto.PageInfo
    4. com.csdn.fruit.dto.PageQueryParam
    5. com.csdn.fruit.dto.Result
    6. com.csdn.fruit.service.FruitService
    7. com.csdn.fruit.service.impl.FruitServiceImpl
    8. com.csdn.fruit.servlet.FruitController
    9. com.csdn.fruit.util.GsonUtil
    10. com.csdn.fruit.util.RequestUtil
    11. com.csdn.fruit.util.ResponseUtil
    12. com.csdn.mymvc.annotation.Autowire
    13. com.csdn.mymvc.annotation.Controller
    14. com.csdn.mymvc.annotation.GetMapping
    15. com.csdn.mymvc.annotation.PostMapping
    16. com.csdn.mymvc.annotation.Repository
    17. com.csdn.mymvc.annotation.RequestMapping
    18. com.csdn.mymvc.annotation.Service
    19. com.csdn.mymvc.core.ComponentScan
    20. com.csdn.mymvc.core.DispatcherServlet
    21. com.csdn.mymvc.listener.ContextLoaderListener

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

    1. interface com.csdn.fruit.dao.FruitDao
    2. class com.csdn.fruit.dao.impl.FruitDaoImpl
    3. class com.csdn.fruit.dto.PageInfo
    4. class com.csdn.fruit.dto.PageQueryParam
    5. class com.csdn.fruit.dto.Result
    6. interface com.csdn.fruit.service.FruitService
    7. class com.csdn.fruit.service.impl.FruitServiceImpl
    8. class com.csdn.fruit.servlet.FruitController
    9. class com.csdn.fruit.util.GsonUtil
    10. class com.csdn.fruit.util.RequestUtil
    11. class com.csdn.fruit.util.ResponseUtil
    12. interface com.csdn.mymvc.annotation.Autowire
    13. interface com.csdn.mymvc.annotation.Controller
    14. interface com.csdn.mymvc.annotation.GetMapping
    15. interface com.csdn.mymvc.annotation.PostMapping
    16. interface com.csdn.mymvc.annotation.Repository
    17. interface com.csdn.mymvc.annotation.RequestMapping
    18. interface com.csdn.mymvc.annotation.Service
    19. class com.csdn.mymvc.core.ComponentScan
    20. class com.csdn.mymvc.core.DispatcherServlet
    21. class com.csdn.mymvc.listener.ContextLoaderListener

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

    1. class com.csdn.fruit.dao.impl.FruitDaoImpl
    2. class com.csdn.fruit.dto.PageInfo
    3. class com.csdn.fruit.dto.PageQueryParam
    4. class com.csdn.fruit.dto.Result
    5. class com.csdn.fruit.service.impl.FruitServiceImpl
    6. class com.csdn.fruit.servlet.FruitController
    7. class com.csdn.fruit.util.GsonUtil
    8. class com.csdn.fruit.util.RequestUtil
    9. class com.csdn.fruit.util.ResponseUtil
    10. class com.csdn.mymvc.core.ComponentScan
    11. class com.csdn.mymvc.core.DispatcherServlet
    12. 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]

     

  • 相关阅读:
    变革加速,博睿数据赋能“中国智造”转型升级
    7.0、C语言——数组
    掌握Go语言:深入encoding/gob包的高效数据序列化
    spring6-国际化:i18n | 数据校验:Validation
    AtomicReference实现单例模式
    一个悄然崛起的国产软件
    0822(036天 线程/进程07 Lock接口、集合框架01 Iterator迭代器)
    用 Python 这样去创建词云不是更美嘛?
    JWT 安全及案例实战
    Chromium Trace and Perfetto使用详解
  • 原文地址:https://blog.csdn.net/m0_65152767/article/details/134253216