源码

跟踪Spring源码(一)

自闭症网瘾萝莉.ら 提交于 2021-01-23 23:34:17
一、上下文加载器 要在项目中使用Spring框架,需要在web.xml做如下配置: <!--contextConfigLocation在 ContextLoaderListener类中的默认值是 /WEB-INF/applicationContext.xml--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> <!-- <param-value>classpath:applicationContext*.xml</param-value> --> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> 以下为类ContextLoaderListener的声明: public class ContextLoaderListener extends ContextLoader implements ServletContextListener{ // 上下文加载器 private

boa阅读笔记2

拟墨画扇 提交于 2021-01-06 02:03:20
fixup_server_root(); read_config_files(); open_logs(); server_s = create_server_socket(); init_signals(); drop_privs(); create_common_env(); build_needs_escape(); 上次我们讲到了处理命令行选项,接下来要分析一系列初始化函数,先介绍第一个函数。 static void fixup_server_root() { char *dirbuf; if (!server_root) {//如果命令行选项中没有指定server_root,则设置server_root #ifdef SERVER_ROOT //从头文件读取SERVER_ROOT的值 server_root = strdup(SERVER_ROOT); if (!server_root) { perror("strdup (SERVER_ROOT)"); exit(1); } #else //如果没有定义SERVER_ROOT,则报错退出 fputs("boa: don't know where server root is. Please #define " "SERVER_ROOT in boa.h\n" "and recompile, or use the -c

Handler机制源码解析

ぃ、小莉子 提交于 2020-12-17 06:29:26
不多废话 , 上图 : 简单来说 handler 流程就是 handler 在消息池中获取 msg 并发送给 MQ , 再由 Looper 进行轮询在 MQ 中得到待处理的 msg 交由 handler 进行 handleMessage(...); 这里主要涉及到了四个核心类 : Message Handler MessageQueue Looper 那么下面来看看源码里面是怎么实现的 : 1. Message 类 : 用来携带数据的载体 public int what; // 标识 public int arg1; // 携带 int 类型数据 public int arg2; // 携带 int 类型数据 public Object obj;// 携带任意对象数据 long when; // 保存要被处理的时间点 Handler target; // 处理消息的 handler Runnable callback; // 处理消息的回调器对象 Message next; // 用来保存引用的下一个 message( 才能形成链表 ) private static Message sPool; // 存储处理过的消息的池 // 在需要 Message 对象时复用 其中还有recycle()方法 Looper轮询过程中中会用到 2. Handler 类 : 进行消息的发送处理 ,

通过Android源代码分析startActivity()过程(下)

痞子三分冷 提交于 2020-11-23 05:39:10
#通过Android源代码分析startActivity()过程(下) 继续分析startActivity()。 上一篇blog 讲到通过zygote进程fork出了一个新的应用进程,接下来我们需要分析这个进程启动之后的事情。 zygote进程fork出一个新的app进程后,就会调用他ActivityThread类的的main方法来启动它,所以,一个新进程的真正入口并不是我们通常所说的Application#onCreate方法,而是ActivityThread#main方法。 我们就从这个main方法开始分析: public static void main(String[] args) { //1. 为本进程准备好UI线程的消息队列和Looper Looper.prepareMainLooper(); //2.把ApplicationThread跟远程AMS关联起来 ActivityThread thread = new ActivityThread(); thread.attach(false); if (sMainThreadHandler == null) { sMainThreadHandler = thread.getHandler(); } //3. 开始执行消息循环 Looper.loop(); throw new RuntimeException("Main

程序员做些业余项目的重要性

生来就可爱ヽ(ⅴ<●) 提交于 2020-05-03 22:42:37
编程是一种创造过程,业余项目允许程序员在没有截止日期或各种限制的条件下,以探索形式编程。业余项目之所以重要,有以下几个原因。 探索新技术 每天都会不断有新技术出现,开始不知道开发安卓应用需要做保护,如果一旦你的一个应用上市场是为了获得一定的外快,这个就不得不知道。办法总是比困难多,在你还没遇到的时候有人遇到了,并且研究出了解决办法—— 爱加密专业安卓应用加密技术 。同时业余项目则是最佳的试验场。作为业余项目,你不必为bug或者性能问题担心,即使网站崩溃也没有问题,因为你不靠它来领薪水。 从头创造 我所从事的大多数都是为现有的产品做一些维护,增加一些新特性,修复bug,解决性能问题,重构现有代码。虽然我也从头编写过一些软件,但这些基础工作只需要一两个月,接下来我又进入维护模式了。 业余项目经常需要从头构建。我喜欢这个步骤,因为我不但复习了已经掌握的所有东西而且把它们应用到创建一个新的(更好的)项目中。 易于启动 进行业余项目也是一项避免分析瘫痪(analysis paralysis)的练习。如果你从头开始会有各种各样的可能性。避免的方法是给出一个短列表上面列出所有必须具有特性,接下来启动一个beta版本实现那些特性,即所谓的最小可行性产品[TODO]。 编注1:分析瘫痪:对某个问题由于过度分析或过度思考某种情况,以至于没有作出决定或者采取行动。在不同的领域,分析瘫痪有具体的解释

设计模式之二:Builder模式

ε祈祈猫儿з 提交于 2020-04-22 07:35:58
设计模式之二:Builder模式 目录介绍 0.关于Builder模式案例下载 1.Builder模式介绍 2.Builder模式使用场景 3.Builder模式简单案例 3.1 Builder模式UML图(摘自网络) 3.2 在《Android源码设计模式》这本书上,介绍经典Builder模式中,包括 3.3 Product角色 3.4 Builder : 抽象Builder类,规范产品组建,一般是由子类实现具体的组建过程 3.5 ConcreteBuilder : 具体的Builder类 3.6 Director : 统一组装过程 4.Builder模式实际案例Demo 4.1 实际开发中,有时会遇到复杂的对象的代码 4.2 通过构造函数的参数形式去写一个实现类,或者通过set,get去实现 4.3 分析 4.4 将上面例子改成builder模式如下所示 4.5 最后运用,代码如下 4.6 关于线程安全问题 5.Android源码中的Builder模式实现 5.1 首先看看AlertDialog.Builder源代码,只是摘自部分代码 5.2 接下来看看build源代码 5.3 接下来看看show的代码 5.4 为什么AlertDialog要使用builder模式呢? 6.Builder模式总结 6.1 builder模式优点 6.2 builder模式缺点 7.关于其他说明

JDBC-MYSQL源码学习1

假如想象 提交于 2020-04-17 03:47:53
【推荐阅读】微服务还能火多久?>>> 总所周知,JAVA给连接不同数据库定义了一个JDBC标准接口,由各个数据库厂商按此标准自己实现,供开发人员调用,对此一直以来比较好奇,之前由于能 力有限没有勇气去看源代码,不过最终还是“好奇害死猫”。对MYSQL的JDBC源码在初步缓慢的学习,由于知识和认知度有限,有错误请大家多多支出,并 一起讨论,谢谢。 今天从最初加载Mysql的Driver类开始,这句话【 Class.forName("com.mysql.jdbc.Driver"); 】大家应该不会陌生吧,具体这句话做了什么呢?呵呵,看下 Driver的源代码就可以知道了。 com.mysql.jdbc.Driver 的源码解释如下( 一部分): /** * When a Driver class is loaded, it should create an instance of itself and * register it with the DriverManager. This means that a user can load and * register a driver by doing Class.forName("foo.bah.Driver") **/ com.mysql.jdbc.Driver 基础了 com.mysql.jdbc

nginx源码之内存池

混江龙づ霸主 提交于 2020-04-12 18:53:26
Ngnix 内存池结构体和接口定义主要在以下几个文件: core 文件夹下的 :ngx_palloc.h ngx_palloc.c os/unix 文件夹下的 :ngx_alloc.h ngx_alloc.c 内存池相关的核心结构体: struct ngx_pool_large_s { ngx_pool_large_t *next; void *alloc; }; typedef struct { u_char *last; u_char *end; ngx_pool_t *next; ngx_uint_t failed; } ngx_pool_data_t; struct ngx_pool_s { ngx_pool_data_t d; size_t max; ngx_pool_t *current; ngx_chain_t *chain; ngx_pool_large_t *large; ngx_pool_cleanup_t *cleanup; ngx_log_t *log; }; 可以看出 nginx 内存池是个链表结构,每个内存池包括头部和数据部分。 其中数据部分又分成两部分:一个是小块数据分配 ngx_pool_data_t, 另外一个是大数据块的分配: ngx_pool_large_t 。一般的内存分配是在 ngx_pool_data_t 中 , 但是如果分配的内存过大

HBase 源码-Run Shell

北慕城南 提交于 2020-04-12 15:38:12
居然是这篇文章被推荐了, 其实这是一个系列的文章, 前面还有两篇 HBase 源码的准备工作: (1). 《 HBase 源码-下载,编译 》 (2). 《 HBase 源码-Start Server 》 根据前前文《 HBase 源码-Start Server 》 启好 Server 后, run 了几个 TestCase, 还是很迷茫, 不知该从何下手去啃这一大堆代码, 就想着先把 shell 启起来, 尝试建几个表, 并往里面插入一些数据. 1. 启动 shell 与启动 server 类似, 这里也需要 Run --> Run Configurations... , 添加 一个 Java Application, 设置 Project 为 hbase-shell , Main class 为 org.jruby.Main , Arguments 为 hirb.rb 全路径 , 由于 hirb.rb 为 ruby 程序, 所以还应在 VM arguments 中指定 ruby 库所在路径(HBase 0.97 版本位于 hbase-shell/src/main/ruby) , 如下两图 . 2. 测试 shell 配置完成后, 点击 run, 即可启动 shell, 然后 如下图 进行 建表, 插数据, 读数据. ( 注意需要先启动 server ) 3. HBase

Android Contacts源码Eclipse开发编译环境搭建

久未见 提交于 2020-04-12 14:03:57
此文不同于官方文档给出的方案,之所以如此,基于以下考虑几点考虑:我们之所以拿源码进行增量开发,一般而言,不是为了整个工程,而是为了其中某个特定的模块,比如说 Contacts , Luancher 等;其次,官方方案有一个巨大的缺陷——优化后的模块打包成 apk 很有可能无法在其他系统上安装,因为它有系统权限,并且一直签 rom 的签名,而这个签名在其他系统上是拿不到的。换句话说,除非你想做嵌入式,否则别这么干。 具体步骤: 编译源码:由于这些模块依赖的包中有一部分是不开放的,所以,只能把整个源码编译一遍,然后拿出相关的 jar 包。 关于如何编译源码网上有很多说明,都是用 git 把源码下载下来( 4G 左右),然后配下相应的编译环境。请参照: Justin 的 Build Android Platform 。通常会遇到一些错误,编译停止,这些错误通常都是一些库函数找不到,这时候你只需要将相应的库函数下载下来,也就是完善一下你的编译环境,比如说这个错误:“ /usr/bin/ld: cannot find -lz collect2: ld returned 1 exit status make: *** [out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/aapt] Error 1 ” 这个错误我曾经试了很多种方法