技术标签: spring boot spring源码
1、在run方法的第一步执行就是记录启动的耗时
StopWatch stopWatch = new StopWatch();
stopWatch.start();
stopWatch.start()和stopWatch.stop()是成对出现的,这之间的部分就是StopWatch监控的事件,主要用于监控执行时长
2、在stopWatch.stop()执行之后会有一段打印启动日志的代码,我们可以继续跟进,然后看看静静做了些什么
stopWatch.stop();
if (this.logStartupInfo) {
new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch);
}
3、其他代码直接路过,我们跟踪这块代码
new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch);
初始化对象这个代码不看,主要看logStarted方法
这个方法有2个参数
- 第一个参数是一个Log对象
getApplicationLog()
获取到了,这里的代码很简单LogFactory.getLog
不做太多解读- 第二个参数是一个stopWatch
进入这个方法之后我们就看到这个方法的逻辑
void logStarted(Log applicationLog, StopWatch stopWatch) {
if (applicationLog.isInfoEnabled()) {
applicationLog.info(getStartedMessage(stopWatch));
}
}
从这里可以猜到,这段代码主要就是打印启动耗时日志的getStartedMessage
方法应该就是拼接一段日志
private CharSequence getStartedMessage(StopWatch stopWatch) {
StringBuilder message = new StringBuilder();
message.append("Started ");
appendApplicationName(message);
message.append(" in ");
message.append(stopWatch.getTotalTimeMillis() / 1000.0);
message.append(" seconds");
try {
double uptime = ManagementFactory.getRuntimeMXBean().getUptime() / 1000.0;
message.append(" (JVM running for ").append(uptime).append(")");
}
catch (Throwable ex) {
// No JVM time available
}
return message;
}
看到这段代码,彻底的验证了我们的想法是正确的,这段代码就是在评价一个字符串,作为上一个方法的输出内容
我们从启动日志最终也看到了日志的打印内容,就是我们getStartedMessage
运算之后的结果
com.abc.Application : Started Application in 316.903 seconds (JVM running for 587.73)
在学习的过程中,效率是极其重要的。效率能决定你学习同一件事的时间长短与记忆深浅。而很多人往往喜欢心血来潮,放言要猛学一个月,或者二十天搞定什么特殊难题,结果第一天学了一天,第二天就坚持不下去了。这是因为没有重视计划的可行性,因此效率大打折扣。学习编程也一样,那么如何分配时间才能达到事半功倍的效果呢?在学习的过程中,我总结了一些感受(个人想法)一、很多人说程序员是吃青春饭,身体是革命的本钱,健康永远要放在首位,首先要调整好自己的状态,一定不要在头晕发烧的时候学习编程,不但学不进去浪费时间,还让自己产生_编程怎么学才更有效率
之前给win7做了一些优化,导致无法更新,错误代码为80072f8f,解决方法摘自微软的官方网站,描述如下:使用自动疑难解答进行诊断Windows 8 和 Windows 7运行 Windows Update 自动化疑难解答程序。 (http://go.microsoft.com/?linkid=9830262) Windows Vista
Python3.6.8安装turtle:pip3 install turtle提示错误:Collecting turtle Using cached https://files.pythonhosted.org/packages/ff/f0/21a42e9e424d24bdd0e509d5ed3c7dfb8f47d962d9c044dba903b0b4a26f/turtle-0...
转自:http://www.cppblog.com/aurain/archive/2010/11/01/132026.htmlTrueCrypt是一款开源的虚拟加密磁盘工具,目前最新版本是7.0a,本文以该版本源代码为基础,介绍了如何在VC2008下进行编译。 环境配置1. Microsoft Visual Studio 2008 SP1 (VC++ 2008) 2. Mi
MPI多进程并行计算矩阵乘法实现,对原始矩阵A、B进行初始化算为: 其主要思想:是把相乘的矩阵按行分解(任务分解),分别分给不同的进程,然后在汇总到一个进程上,在程序上实现则用到了主从模式,人为的把进程分为主进程和从进程,主进程负责对原始矩阵初始化赋值,并把数据均匀分发(为了负载均衡)到从进程上进行相乘运算,主要用到的知识是MPI点对点通信的机制。具体代码为:// YinXing_Matrix_m..._mpi矩阵向量乘法c语言
反转一个单链表。示例:输入: 9->5->2->7->3->NULL输出: 3->7->2->5->9->NULL代码要求:/** * Definition for singly-linked list. * * public class ListNode {* * int val;* * List..._java206. 反转链表
前言echarts地图的相关的资料也找了好久,市县级地图的资源资本是要积分下载的,有的10个,有的40、50个积分,10个积分能理解,但是50个就有点过分了。这里我的资料也是下载了别人的,所以大家也还是去找找只要几个积分资源吧。下面上写法Vue配置文件先在配置文件里引入echarts// The Vue build version to load with the `import` ..._echarts namemap
今天偶然间看到掘进一片不错的关于前端进行SEO优化和性能优化的文章,感觉总结的很不错,就把搬过来的用了。附上原文链接https://juejin.im/post/5aca235a6fb9a028d567631a。seo优化 前端需要注意哪些SEO合理的title、description、keywords,搜索对着三项的权重逐渐减小,title只需强调重点,关键词不要重复超过两次,而且需要靠前,不同...
WIN10映射ubuntu1604共享目录(网络驱动器)1. 安装samba安装samba:sudoapt-get install samba安装smbclient:sudoapt-get install smbclient 2. 修改samba配置文件并重启samba[home]#共享目录的名称,可根据需要来起名字comment = Shared Folder require pas...
1.2 算法概述概述通俗:解决问题的思路是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制输入:可以提供零到多个数据输出:至少有一个结果有穷性:算法在有限的步骤(有限的执行时间)里面执行出结果确定性:写算法的时候,一个输入对应一个输出,结果是确定的(输入一个1,一会输出2一会输出3不行)可行性:写的算法要能解决实际问题正确性:算法能正确的解决问题可读性:让其他程序员能够看懂健壮性:如遇到1/0,报错时候要给用户一个提示时
R2 (e0/4/1)----- SW1----- R3(e0/4/1)<H3C>%Dec 11 17:12:57:797 2010 H3C SHELL/4/LOGIN: Console login from con0<H3C><H3C>syssysSystem View: return to Use...
1.srvctl,要在oracle用户下运行srvctl status database -d 数据库名 实例运行状态srvctl status instance -d 数据库名 -i 实例名 指定实例运行状态srvctl status nodeapps -n 节点名 节点应用程序状态srvctl config database –d 数据库名 显示rac数据库的配置srvctl start|stop|status instance -d <db_name> -i <in_oracle rac数据库命令