Latke Code View - Latke.java

本贴最后更新于 3072 天前,其中的信息可能已经渤澥桑田

大致的代码结构:

  • java
  • b3log
  • cache,cron,event,image,intercept,ioc
  • logging,mail,model,plugin,remote,repository
  • service,servlet,taskqueue,thread,urlfetch,user,util
  • Latkes.java
  • Keys.java,Runtimetabase.java,RuntimeEnv.java,RuntimeMode.java
  • json
  • weborganic
  • resources
  • beans.xml

Latkes.java 下面那一行涉及的代码基本没有逻辑,全是枚举或者常量值的定义,想来无可研究。
开始的字段定义继续忽略,首先是静态代码块(删去了 LOGGER):

static { try { final InputStream resourceAsStream = Latkes.class.getResourceAsStream("/latke.properties"); if (null != resourceAsStream) { LATKEPROPS.load(resourceAsStream); } } catch (final Exception e) { throw new RuntimeException("Not found latke.properties"); } try { final InputStream resourceAsStream = Latkes.class.getResourceAsStream("/local.properties"); if (null != resourceAsStream) { LOCALPROPS.load(resourceAsStream); } } catch (final Exception e) { } try { final InputStream resourceAsStream = Latkes.class.getResourceAsStream("/remote.properties"); if (null != resourceAsStream) { REMOTEPROPS.load(resourceAsStream); } } catch (final Exception e) { } }

需要注意的点:

  • 静态代码块,意味着这段代码将在类实例化的时候首先得到执行
  • Latkes.class.getResourceAsStream,这个用法不知是什么
  • LATKE_PROPS 是 Properties 类型_

_

接下来大部分是从 properties 文件里获取配置的方法,不一一列举,如:

public static String getStaticResourceVersion() { //如果没有值,则从配置文件中读取,否则直接返回 if (null == staticResourceVersion) { staticResourceVersion = LATKEPROPS.getProperty("staticResourceVersion"); //如果没有读取到,则赋予默认值 if (null == staticResourceVersion) { staticResourceVersion = startupTimeMillis; } } return staticResourceVersion; }

_

初始化运行环境,Starter 类会调用该方法:

public static void initRuntimeEnv() { if (null != runtimeEnv) { return; } final String runtimeEnvValue = LATKEPROPS.getProperty("runtimeEnv"); //latke.properties if (null != runtimeEnvValue) { //如果不为空,说明配置里有设置,读取设置 runtimeEnv = RuntimeEnv.valueOf(runtimeEnvValue); } //配置为空,设置为-本地 runtimeEnv = RuntimeEnv.LOCAL; //获取设置运行模式 if (null == runtimeMode) { final String runtimeModeValue = LATKEPROPS.getProperty("runtimeMode"); if (null != runtimeModeValue) { runtimeMode = RuntimeMode.valueOf(runtimeModeValue); } else { runtimeMode = RuntimeMode.PRODUCTION; } } if (RuntimeEnv.LOCAL == runtimeEnv) { // Read local database configurations final RuntimeDatabase runtimeDatabase = getRuntimeDatabase(); //local.properties if (RuntimeDatabase.H2 == runtimeDatabase) { final String newTCPServer = Latkes.getLocalProperty("newTCPServer"); if ("true".equals(newTCPServer)) { final String jdbcURL = Latkes.getLocalProperty("jdbc.URL"); if (Strings.isEmptyOrNull(jdbcURL)) { throw new IllegalStateException("The jdbc.URL in local.properties is required"); } final String[] parts = jdbcURL.split(":"); if (parts.length != Integer.valueOf("5")/* CheckStyle.... */) { throw new IllegalStateException("jdbc.URL should like [jdbc:h2:tcp://localhost:8250/~/] (the port part is required)"); } String port = parts[parts.length - 1]; port = StringUtils.substringBefore(port, "/"); try { h2 = org.h2.tools.Server.createTcpServer(new String[]{"-tcpPort", port, "-tcpAllowOthers"}).start(); } catch (final SQLException e) { final String msg = "H2 TCP server create failed"; throw new IllegalStateException(msg); } } } } locale = new Locale("enUS"); }

  • 这段代码中包含了当数据库是 H2 时的处理,大概时使用该数据库时要自己做的事情吧,毕竟是纯 Java 库,想来不必深究,其文档应该有说明。
  • Locale 类的作用意义不明。

关闭 Latke

public static void shutdown() { try { if (RuntimeEnv.LOCAL != getRuntimeEnv()) { return; } //关闭数据库连接池 Connections.shutdownConnectionPool(); final RuntimeDatabase runtimeDatabase = getRuntimeDatabase(); switch (runtimeDatabase) { case H2: final String newTCPServer = Latkes.getLocalProperty("newTCPServer"); if ("true".equals(newTCPServer)) { h2.stop(); h2.shutdown(); } break; default: } //关闭定时任务 CronService.shutdown(); //关闭执行的线程 LocalThreadService.EXECUTORSERVICE.shutdown(); } catch (final Exception e) { } //停止应用生命周期 Lifecycle.endApplication(); // This manually deregisters JDBC driver, which prevents Tomcat from complaining about memory leaks //注销数据库连接驱动 final Enumeration drivers = DriverManager.getDrivers(); while (drivers.hasMoreElements()) { final Driver driver = drivers.nextElement(); try { DriverManager.deregisterDriver(driver); } catch (final SQLException e) { } } }

_

  • Connections, CronService, LocalThreadService, Lifecycle 均为 b3log 包下的类,此时暂不做进一步研究。
  • Driver 为 java.sql 包下的类。

加载皮肤,这个看似跟 MVC 无关的内容,放在这里,有点琢磨不透,可能是因为预先想到了由不同的皮肤,而在公共的框架上提供了支持吧:

public static void loadSkin(final String skinDirName) { final ServletContext servletContext = AbstractServletListener.getServletContext(); Templates.MAINCFG.setServletContextForTemplateLoading(servletContext, "skins/" + skinDirName); Latkes.setTimeZone("Asia/Shanghai"); }

_

  • AbstractServletListener, Templates 为 b3log 的类,暂不详查
  • ServletContext 有什么特殊的地方?

获取皮肤名称:

public static String getSkinName(final String skinDirName) { try { final Properties ret = new Properties(); final File file = getWebFile("/skins/" + skinDirName + "/skin.properties"); ret.load(new FileInputStream(file)); return ret.getProperty("name"); } catch (final Exception e) { return null; } } public static File getWebFile(final String path) { final ServletContext servletContext = AbstractServletListener.getServletContext(); File ret; try { final URL resource = servletContext.getResource(path); if (null == resource) { return null; } ret = FileUtils.toFile(resource); if (null == ret) { final File tempdir = (File) servletContext.getAttribute("javax.servlet.context.tempdir"); ret = new File(tempdir.getPath() + path); FileUtils.copyURLToFile(resource, ret); ret.deleteOnExit(); } return ret; } catch (final Exception e) { return null; } }

  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3455 回帖 • 168 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 826 关注
  • CodeView
    5 引用 • 5 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
ZephyrJung
一切有为法,如梦幻泡影,如露亦如电,应作如是观 北京

推荐标签 标签

  • 分享

    有什么新发现就分享给大家吧!

    247 引用 • 1794 回帖 • 2 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    239 引用 • 224 回帖
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    210 引用 • 2040 回帖
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    21 引用 • 31 回帖
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    84 引用 • 324 回帖
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    211 引用 • 358 回帖
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    21 引用 • 204 回帖
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    133 引用 • 1124 回帖 • 121 关注
  • 博客

    记录并分享人生的经历。

    273 引用 • 2388 回帖
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    78 引用 • 396 回帖 • 1 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 3 关注
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 655 关注
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖 • 1 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 22 关注
  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    432 引用 • 1250 回帖 • 599 关注
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    85 引用 • 165 回帖
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    5 引用 • 7 回帖 • 3 关注
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 67 回帖 • 444 关注
  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    8 引用 • 26 回帖 • 1 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 87 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖 • 3 关注
  • abitmean

    有点意思就行了

    34 关注
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 296 关注
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    12 引用 • 54 回帖 • 166 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 735 关注
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 83 关注