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

     

  • 相关阅读:
    基于PHP+MySQL企业网络推广平台系统的设计与实现
    linux硬盘挂载
    (二)linux文件的基本属性
    Leetcode799. 香槟塔
    make: /opt/rh/llvm-toolset-7/root/usr/bin/clang: Command not found
    【 OpenGauss源码学习 —— 列存储(CU)(三)】
    RP9学习-2
    【Python刷题篇】——Python入门 012 正则表达式
    MacOS升级后命令行出现xcrun: error: invalid active developer path报错信息
    RabbitMQ 3.7.9版本中,Create Channel超时的常见原因及排查方法
  • 原文地址:https://blog.csdn.net/m0_65152767/article/details/134253216