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

     

  • 相关阅读:
    计算机竞赛 深度学习乳腺癌分类
    第三章:最新版零基础学习 PYTHON 教程(第十五节 - Python 运算符—Python 成员身份和身份运算符)
    品牌公关稿件怎么写?纯干货
    MSQL系列(四) Mysql实战-索引分析Explain命令详解
    postman接口自动化测试
    全球与中国亚麻布行业市场现状分析及投资可行性研究报告2022-2028年
    《大数据:互联网大规模数据挖掘与分布式处理》(第2版)习题6.1.1-6.1.3解析
    Halcon WPF 开发学习笔记(3):WPF+Halcon初步开发
    JavaScript小技能:原型链的运作机制、Promise链
    微信小程序使用echarts组件实现饼状统计图功能
  • 原文地址:https://blog.csdn.net/m0_65152767/article/details/134253216