1. 1 不可撤销
  2. 2 小年兽 程嘉敏
  3. 3 手放开 李圣杰
  4. 4 迷人的危险3(翻自 dance flow) FAFA
  5. 5 山楂树之恋 程佳佳
  6. 6 summertime cinnamons / evening cinema
  7. 7 不谓侠(Cover 萧忆情Alex) CRITTY
  8. 8 神武醉相思(翻自 优我女团) 双笙
  9. 9 空山新雨后 音阙诗听 / 锦零
  10. 10 Wonderful U (Demo Version) AGA
  11. 11 广寒宫 丸子呦
  12. 12 陪我看日出 回音哥
  13. 13 春夏秋冬的你 王宇良
  14. 14 世界が终わるまでは… WANDS
  15. 15 多想在平庸的生活拥抱你 隔壁老樊
  16. 16 千禧 徐秉龙
  17. 17 我的一个道姑朋友 双笙
  18. 18 大鱼  (Cover 周深) 双笙
  19. 19 霜雪千年(Cover 洛天依 / 乐正绫) 双笙 / 封茗囧菌
  20. 20 云烟成雨(翻自 房东的猫) 周玥
  21. 21 情深深雨濛濛 杨胖雨
  22. 22 Five Hundred Miles Justin Timberlake / Carey Mulligan / Stark Sands
  23. 23 斑马斑马 房东的猫
  24. 24 See You Again Wiz Khalifa / Charlie Puth
  25. 25 Faded Alan Walker / Iselin Solheim
  26. 26 Natural J.Fla
  27. 27 New Soul Vox Angeli
  28. 28 ハレハレヤ(朗朗晴天)(翻自 v flower) 猫瑾
  29. 29 像鱼 王贰浪
  30. 30 Bye Bye Bye Lovestoned
  31. 31 Blame You 眠 / Lopu$
  32. 32 Believer J.Fla
  33. 33 书信 戴羽彤
  34. 34 柴 鱼 の c a l l i n g【已售】 幸子小姐拜托了
  35. 35 夜空中最亮的星(翻自 逃跑计划) 戴羽彤
  36. 36 慢慢喜欢你 LIve版(翻自 莫文蔚) 戴羽彤
  37. 37 病变(翻自 cubi) 戴羽彤
  38. 38 那女孩对我说 (完整版) Uu
  39. 39 绿色 陈雪凝
  40. 40 月牙湾 LIve版(翻自 F.I.R.) 戴羽彤
夜空中最亮的星(翻自 逃跑计划) - 戴羽彤
00:00 / 04:10

夜空中最亮的星 能否听清

那仰望的人 心底的孤独和叹息

夜空中最亮的星 能否记起

那曾与我同行 消失在风里的身影

我祈祷拥有一颗透明的心灵

和会流泪的眼睛

给我再去相信的勇气

越过谎言去拥抱你

每当我找不到存在的意义

每当我迷失在黑夜里

噢喔喔 夜空中最亮的星

请指引我靠近你

夜空中最亮的星 是否知道

那曾与我同行的身影 如今在哪里

夜空中最亮的星 是否在意

是等太阳先升起 还是意外先来临

我宁愿所有痛苦都留在心底

也不愿忘记你的眼睛

哦 给我再去相信的勇气

哦 越过谎言去拥抱你

每当我找不到存在的意义

每当我迷失在黑夜里

噢喔喔 夜空中最亮的星

请照亮我向前行 哒~

我祈祷拥有一颗透明的心灵

和会流泪的眼睛 哦

给我再去相信的勇气

哦 越过谎言去拥抱你

每当我找不到存在的意义

每当我迷失在黑夜里

噢喔喔 夜空中最亮的星

请照亮我向前行

手写web服务器:实现全包扫描和简易IOC

前言

最近写web服务器优点上头,根本停不下来,对,我就是卷王本卷,昨天实现了前端有参方法的调用,趁着这股热劲,今天我们来实现下IOC容器,从原理和实现上来讲,都不难了,因为我们在controllerrequestMapping注解实现的时候已经验证过了,沿着同样的思路搞就行了。好了话不多说,直接开整。

开整

同样是基于我们之前的代码实现,感兴趣的小伙伴可以去看完整代码,文末有项目地址。

Serive注解

写这个注解主要是为了测试,本来要实现Component,一时半会没想起来单词如何拼写,所以就选择了service

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Service {
    String value() default "";
}

注解的内容和前面的都差不多,很简单,就是加了个targetRetention,然后把这个类加在我们的service上即可:

@Service
public class TestService {

    public void helloIoc(String name) {
        System.out.println("hello ioc, " + name);
    }
}

优化包扫描器

之前的包扫描器只能扫描一层目录,这样每层都指定包名就很繁琐,所以我把它简单优化了下,这样只用输入根包名,就可以实现整包扫描。

这里用到了递归,当路径是文件夹时,就会再次调用自己。

 private static void scanPackageToIoc(String packageName, Set<Class> classSet)
            throws IOException, ClassNotFoundException {
        logger.info("start to scanPackage, packageName = {}", packageName);
        Enumeration<URL> classes = ClassLoader.getSystemResources(packageName.replace('.', '/'));
        while (classes.hasMoreElements()) {
            URL url = classes.nextElement();
            File packagePath = new File(url.getPath());
            if (packagePath.isDirectory()) {
                File[] files = packagePath.listFiles();
                for (File file : files) {
                    String fileName = file.getName();
                    if (file.isDirectory()) {
                        String newPackageName = String.format("%s.%s", packageName, fileName);
                        scanPackageToIoc(newPackageName, classSet);
                    } else {
                        String className = fileName.substring(0, fileName.lastIndexOf('.'));
                        String fullClassName = String.format("%s.%s", packageName, className);
                        classSet.add(Class.forName(fullClassName));
                    }
                }
            } else {
                String className = url.getPath().substring(0, url.getPath().lastIndexOf('.'));
                String fullClassName = String.format("%s.%s", packageName, className);
                classSet.add(Class.forName(fullClassName));
            }
        }
        logger.info("scanPackage end, classSet = {}", classSet);
    }

测试

我们指定个包路径测试下,顺便测试下通过Ioc拿到对象,实现方法调用:

scanPackageToIoc("io.github.syske.boot", classSet);
logger.info("classSet = {}", classSet);
scanRequestMapping(classSet);
logger.info("requestMappingMap = {}", requestMappingMap);
initSyskeBootContent(classSet);
logger.info("contentMap = {}", contentMap);
Object o = contentMap.get("io.github.syske.boot.service.TestService");
if (o instanceof TestService) {
    ((TestService)o).helloIoc("云中志");
}

包扫描完后,生成一个classset集合;

通过scanRequestMapping方法从class集合中拿出controller的类,并生成requestMapping和方法的集合;

通过initSyskeBootContent方法从class集合中拿出service的类,并创建实例,放进contentMap,这样在你需要实例的时候,直接通过全类名(包名 + 类名)就可以拿到,然后执行你想要执行的方法即可。

看下效果:

883  [main] INFO  i.g.s.b.h.SyskeBootContentScanHandler - scanRequestMapping end, requestMappingMap = {/sayHello2=public java.lang.String io.github.syske.boot.controller.TestController.test(java.lang.String,java.lang.String), /sayHello=public java.lang.String io.github.syske.boot.controller.TestController.testName(java.lang.String), /test2=public java.lang.String io.github.syske.boot.controller.Test2Controller.test2(), /test=public java.lang.String io.github.syske.boot.controller.TestController.testRequstMapping()} 
883  [main] INFO  i.g.s.b.h.SyskeBootContentScanHandler - requestMappingMap = {/sayHello2=public java.lang.String io.github.syske.boot.controller.TestController.test(java.lang.String,java.lang.String), /sayHello=public java.lang.String io.github.syske.boot.controller.TestController.testName(java.lang.String), /test2=public java.lang.String io.github.syske.boot.controller.Test2Controller.test2(), /test=public java.lang.String io.github.syske.boot.controller.TestController.testRequstMapping()} 
899  [main] INFO  i.g.s.b.h.SyskeBootContentScanHandler - contentMap = {io.github.syske.boot.service.TestService=io.github.syske.boot.service.TestService@2812cbfa} 
hello ioc, 云中志

方法完美被执行,想法实现,打完收工。

总结

又是看起来复杂、写起来不难的一次需求,但是通过这样的方式,能让你更深入的理解springioc原理,当然原理可能会有差异,但是也大同小异,再退一步来说,就算不一样,面试的时候,面试官问你懂不懂Ioc底层原理,你也可以大胆地我自己做过类似于Ioc东西,这一点就很牛皮了。

最近内卷这个词特别火,所有的平台都在讨论,但是IT这个行业不早都在内卷了吗?面试造火箭,进门拧螺丝,太卷了。

前几天看到一个段子,说是一个公司招司机,面试官问司机,你知道汽车的启动过程吗?能大概说一下吗?然后司机巴拉巴拉说了一大堆:

段子原文地址,有兴趣的小伙伴自己去看:

https://blog.csdn.net/dfskhgalshgkajghljgh/article/details/106457745

下面是项目的开源仓库,有兴趣的小伙伴可以去看看,如果有想法的小伙伴,我真心推荐你自己动个手,自己写一下,真的感觉不错:

https://github.com/Syske/syske-boot

posted @ 2021-06-09 13:44  云中志  阅读(98)  评论(0编辑  收藏  举报