1、ComponentScan
package com.csdn.mymvc.core;
import com.csdn.mymvc.annotation.Controller;
import com.csdn.mymvc.annotation.Repository;
import com.csdn.mymvc.annotation.Service;
import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Optional;
public class ComponentScan {
public static Map beanFactory = new HashMap<>();
static String path = null;
path = ComponentScan.class.getClassLoader().getResource("").getPath();
path = path.substring(1);
File rootDir = new File(path);
System.out.println(beanFactory);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
} catch (InvocationTargetException e) {
throw new RuntimeException(e);
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
} catch (InstantiationException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
private static void parseFile(File file) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
if (file.isDirectory()) {
File[] childFiles = file.listFiles();
for (File childFile : childFiles) {
String absPath = file.getAbsolutePath();
String fullClassPath = absPath.substring(path.length());
if (fullClassPath.endsWith(".class")) {
String fullClassPathName = fullClassPath.substring(0, fullClassPath.length() - ".class".length());
String fullClassName = fullClassPathName.replaceAll("\\\\", ".");
Class> clazz = Class.forName(fullClassName);
if (clazz.toString().startsWith("class")) {
if (!Modifier.isAbstract(clazz.getModifiers())) {
Optional
optional = Arrays.stream(clazz.getDeclaredAnnotations()).filter(annotation -> { return (annotation instanceof Controller || annotation instanceof Service || annotation instanceof Repository);
if (!optional.isEmpty()) {
Object bean = clazz.getDeclaredConstructor().newInstance();
beanFactory.put(fullClassName, bean);

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()
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\fruit\dao\FruitDao.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\fruit\dao\impl\FruitDaoImpl.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\fruit\dto\PageInfo.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\fruit\dto\PageQueryParam.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\fruit\dto\Result.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\fruit\service\FruitService.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\fruit\service\impl\FruitServiceImpl.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\fruit\servlet\FruitController.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\fruit\util\GsonUtil.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\fruit\util\RequestUtil.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\fruit\util\ResponseUtil.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\mymvc\annotation\Autowire.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\mymvc\annotation\Controller.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\mymvc\annotation\GetMapping.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\mymvc\annotation\PostMapping.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\mymvc\annotation\Repository.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\mymvc\annotation\RequestMapping.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\mymvc\annotation\Service.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\mymvc\core\ComponentScan.class
F:\IdeaProjects\workspace\review\pro13-fruit-DispatcherServlet\target\pro13-fruit-DispatcherServlet-1.0-SNAPSHOT\WEB-INF\classes\com\csdn\mymvc\core\DispatcherServlet.class
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())
com\csdn\fruit\dao\FruitDao.class
com\csdn\fruit\dao\impl\FruitDaoImpl.class
com\csdn\fruit\dto\PageInfo.class
com\csdn\fruit\dto\PageQueryParam.class
com\csdn\fruit\dto\Result.class
com\csdn\fruit\service\FruitService.class
com\csdn\fruit\service\impl\FruitServiceImpl.class
com\csdn\fruit\servlet\FruitController.class
com\csdn\fruit\util\GsonUtil.class
com\csdn\fruit\util\RequestUtil.class
com\csdn\fruit\util\ResponseUtil.class
com\csdn\mymvc\annotation\Autowire.class
com\csdn\mymvc\annotation\Controller.class
com\csdn\mymvc\annotation\GetMapping.class
com\csdn\mymvc\annotation\PostMapping.class
com\csdn\mymvc\annotation\Repository.class
com\csdn\mymvc\annotation\RequestMapping.class
com\csdn\mymvc\annotation\Service.class
com\csdn\mymvc\core\ComponentScan.class
com\csdn\mymvc\core\DispatcherServlet.class
com\csdn\mymvc\listener\ContextLoaderListener.class
6、String fullClassPathName = fullClassPath.substring(0, fullClassPath.length() - ".class".length())
com\csdn\fruit\dao\FruitDao
com\csdn\fruit\dao\impl\FruitDaoImpl
com\csdn\fruit\dto\PageInfo
com\csdn\fruit\dto\PageQueryParam
com\csdn\fruit\dto\Result
com\csdn\fruit\service\FruitService
com\csdn\fruit\service\impl\FruitServiceImpl
com\csdn\fruit\servlet\FruitController
com\csdn\fruit\util\GsonUtil
com\csdn\fruit\util\RequestUtil
com\csdn\fruit\util\ResponseUtil
com\csdn\mymvc\annotation\Autowire
com\csdn\mymvc\annotation\Controller
com\csdn\mymvc\annotation\GetMapping
com\csdn\mymvc\annotation\PostMapping
com\csdn\mymvc\annotation\Repository
com\csdn\mymvc\annotation\RequestMapping
com\csdn\mymvc\annotation\Service
com\csdn\mymvc\core\ComponentScan
com\csdn\mymvc\core\DispatcherServlet
com\csdn\mymvc\listener\ContextLoaderListener
7、String fullClassName = fullClassPathName.replaceAll("\\\\", ".")
com.csdn.fruit.dao.FruitDao
com.csdn.fruit.dao.impl.FruitDaoImpl
com.csdn.fruit.dto.PageInfo
com.csdn.fruit.dto.PageQueryParam
com.csdn.fruit.dto.Result
com.csdn.fruit.service.FruitService
com.csdn.fruit.service.impl.FruitServiceImpl
com.csdn.fruit.servlet.FruitController
com.csdn.fruit.util.GsonUtil
com.csdn.fruit.util.RequestUtil
com.csdn.fruit.util.ResponseUtil
com.csdn.mymvc.annotation.Autowire
com.csdn.mymvc.annotation.Controller
com.csdn.mymvc.annotation.GetMapping
com.csdn.mymvc.annotation.PostMapping
com.csdn.mymvc.annotation.Repository
com.csdn.mymvc.annotation.RequestMapping
com.csdn.mymvc.annotation.Service
com.csdn.mymvc.core.ComponentScan
com.csdn.mymvc.core.DispatcherServlet
com.csdn.mymvc.listener.ContextLoaderListener
8、Class> clazz = Class.forName(fullClassName);System.out.println(clazz.toString());
interface com.csdn.fruit.dao.FruitDao
class com.csdn.fruit.dao.impl.FruitDaoImpl
class com.csdn.fruit.dto.PageInfo
class com.csdn.fruit.dto.PageQueryParam
class com.csdn.fruit.dto.Result
interface com.csdn.fruit.service.FruitService
class com.csdn.fruit.service.impl.FruitServiceImpl
class com.csdn.fruit.servlet.FruitController
class com.csdn.fruit.util.GsonUtil
class com.csdn.fruit.util.RequestUtil
class com.csdn.fruit.util.ResponseUtil
interface com.csdn.mymvc.annotation.Autowire
interface com.csdn.mymvc.annotation.Controller
interface com.csdn.mymvc.annotation.GetMapping
interface com.csdn.mymvc.annotation.PostMapping
interface com.csdn.mymvc.annotation.Repository
interface com.csdn.mymvc.annotation.RequestMapping
interface com.csdn.mymvc.annotation.Service
class com.csdn.mymvc.core.ComponentScan
class com.csdn.mymvc.core.DispatcherServlet
class com.csdn.mymvc.listener.ContextLoaderListener
9、if (clazz.toString().startsWith("class"))
class com.csdn.fruit.dao.impl.FruitDaoImpl
class com.csdn.fruit.dto.PageInfo
class com.csdn.fruit.dto.PageQueryParam
class com.csdn.fruit.dto.Result
class com.csdn.fruit.service.impl.FruitServiceImpl
class com.csdn.fruit.servlet.FruitController
class com.csdn.fruit.util.GsonUtil
class com.csdn.fruit.util.RequestUtil
class com.csdn.fruit.util.ResponseUtil
class com.csdn.mymvc.core.ComponentScan
class com.csdn.mymvc.core.DispatcherServlet
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]
