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

     

  • 相关阅读:
    java计算机毕业设计基于springboot 医院急诊挂号系统
    netty系列之:可以自动通知执行结果的Future,有见过吗?
    利用Python批量替换文档中特定参数的数值
    JavaMail发送和接收邮件API(详解)
    cad转shp再转3dtiles生成白模
    正则表达式在java里的运用
    OnChainMonkey VoxEdit 大赛来袭!赢取16,000 SAND + OnChainMonkey 奖励
    java企业工程项目管理系统源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)
    软件公司之间合作的保密协议
    串口与协议-推荐阅读
  • 原文地址:https://blog.csdn.net/m0_65152767/article/details/134253216