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

夜空中最亮的星 能否听清

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

夜空中最亮的星 能否记起

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

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

和会流泪的眼睛

给我再去相信的勇气

越过谎言去拥抱你

每当我找不到存在的意义

每当我迷失在黑夜里

噢喔喔 夜空中最亮的星

请指引我靠近你

夜空中最亮的星 是否知道

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

夜空中最亮的星 是否在意

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

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

也不愿忘记你的眼睛

哦 给我再去相信的勇气

哦 越过谎言去拥抱你

每当我找不到存在的意义

每当我迷失在黑夜里

噢喔喔 夜空中最亮的星

请照亮我向前行 哒~

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

和会流泪的眼睛 哦

给我再去相信的勇气

哦 越过谎言去拥抱你

每当我找不到存在的意义

每当我迷失在黑夜里

噢喔喔 夜空中最亮的星

请照亮我向前行

实现ComponentScan注解,根据指定包名扫描

前言

手写web服务器,到今天已经实现了controllerRequestMappingRequestParameterService还有简易的Ioc,从构成要素上将我们的小项目已经算是一个比较完整的服务器了,但也有很多需要优化的地方,今天我们就来实现ComponentScan注解,优化一下包扫描,实现可以根据我们指定的包名进行组件扫描。

这个注解,功能上我们参考了spring,因为是纯手写,所以我们并没有去看spring的源码,最近确实也没时间看。

整起来

今天核心的工作就两个,首先是定义一个新的注解,然后我们根据这个注解去扫描指定的包。如果注解不存在,我们就从服务器入口,即SyskeBootServerApplication类所在包开始扫描。

定义ComponentScan注解

现在定义注解以及是轻车熟路了 ,so easy!这里的value() 方法定义的是数组,用于接受需要扫描的包名,也就是说我们也是支持多包名的。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ComponentScan {
    String[] value() ;
}

然后把ComponentScan注解加在我们服务的入口上:

为什么要加在服务器入口上呢?这是我人为规定的,现在还没有实现Configuration注解,加在服务器主入口是最好的选择。

优化包扫描器

根据注解内容优化包扫描器:

/**
     * 扫描指定的包路径,如果无该路径,则默认扫描服务器核心入口所在路径
     * @param aClass
     * @throws IOException
     * @throws ClassNotFoundException
     */
    private static void componentScanInit(Class aClass) throws IOException, ClassNotFoundException {
        logger.info("componentScanInit start init……");
        logger.info("componentScanInit aClass: {}", aClass);
        Annotation annotation = aClass.getAnnotation(ComponentScan.class);
        if (Objects.isNull(annotation)) {
            Package aPackage = aClass.getPackage();
            scanPackage(aPackage.toString(), classSet);
        } else {
            String[] value = ((ComponentScan)annotation).value();
            for (String s : value) {
                scanPackage(s, classSet);
            }
        }
        logger.info("componentScanInit end, classSet = {}", classSet);
    }

在服务器启动时,需要先执行componentScanInit方法,这个方法需要传入一个Class,也就是我们项目的主入口的类。

方法内部会先判断这个类是否有ComponentScan注解,如果有则根据注解value()的值进行扫描,否则拿到传入类的包路径,然后开始扫描。

测试

运行启动下,我们发现控制台已经打印出了扫描到的类:

总结

今天的内容依然很简单,就只是实现了一个注解,然后根据这个注解优化了我们包扫描的业务代码,没有什么复杂的知识点,后面我们还需要对很多功能进行优化,包括以下几点:

  • post请求处理与响应
  • GetMappingPostMapping的实现,这个两个注解实现起来很简单了,和RequestMapping基本上一致
  • 配置注解的实现:valueConfigurationProperties
  • get请求页面模板实现
  • 集中异常处理

目前大概能想到这几点,其他的等后面再说。明天应该会先解决post请求这块,思路已经有了。好了,今天就先到这里吧!

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

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

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