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

     

  • 相关阅读:
    Self-Attention和Multi-Head Attention的详细代码内容(没有原理)
    如何优雅部署OpenStack私有云II--异常处理记录
    钟汉良日记:和鹤岗一样低房价的城市不止一个
    【MySQL必知必会】 表的优化 | 充分利用系统资源
    Axure RP仿QQ音乐app高保真原型图交互模板源文件
    学C++从CMake学起
    c语言贪吃蛇游戏
    Java:File类
    C语言 | Leetcode C语言题解之第4题寻找两个正序数组的中位数
    AI:原来Nacos还能这么玩儿
  • 原文地址:https://blog.csdn.net/m0_65152767/article/details/134253216