【Drogon】框架是如何帮我们读取配置文件的
目前出了一些Drogon框架的视频,视频的内容更多的偏向于使用,并没有过多的涉及到源码,我打算用专栏的形式来解读一下框架的源码,这篇文章算是试试水。
我们可以使用如下命令创建一个新的项目:
默认的main.cc文件内只是监听了一个80端口号,并在主函数的最后使用app().run();运行起整个框架。
对main.cc文件做出如下修改:
从官方的wiki文档以及生成的默认代码的注释中我们都可以得知app().loadConfigFile()函数可以加载一个json格式的文件并进行相应的配置。同时修改后的代码也使用了链式调用,这一点并不重要,只是让代码看起来更简洁一些。
app()的调用链如下:app() → HttpappFramework::instance() → HttpappFrameworkImpl::instance()。其中HttpappFramework类是一个抽象类,Impl是它的一个子类。最终会返回给我们一个Impl类的实例。
loadConfigFile的实现如下:
ConfigLoader的构造函数:
ConfigLoader::load()函数内容如下:
其中的每一个函数都会从构造函数里读取完的内容取出一条子项并进行逐条分析,其中的重头戏是loadapp:
loadapp里读取了43条app的子项(默认生成的config.json文件中只有39条),调用了35个不同的配置函数完成了自动配置。
比如enable_session以及session_timeout两条配置项决定调用enableSession还是disableSession函数,以及在调用enableSession的同时设置过期时间。
以app().setDocumentRoot()函数为例:
它做的事情很简单,就是把传进来的参数存储到了成员变量中。
后续在调用app().run()的时候会读取这些成员变量的值来决定具体的操作:
比如在run()→setupFileLogger()函数中,就会读取logfileBaseName_成员变量。
这一个成员变量是在app().setLogPath()函数中设置的,我们当然可以直接调用这个函数来进行设置,但是在ConfigLoader::loadLogSetting()函数中会自动帮我们调用,而ConfigLoader::loadapp()在调用这个函数时会自动传递进来app["log"]。
所以我们既可以直接调用app().setLogPath(),又可以通过在配置文件中编写app.log,来实现设置日志文件的存储位置。
源码之前,了无秘密。
而drogon源码的阅读,loadConfigFile()是一个不错的入手点。

