源码

Spring AOP 源码解析

妖精的绣舞 提交于 2020-01-24 00:34:26
文章目录 前言 本文使用的调试代码 IOC 容器管理 AOP 实例 ProxyFactory 详解 基于注解的 Spring AOP 源码分析 闲聊 InstantiationAwareBeanPostProcessor 小结 之前写过 IOC 的源码分析,那篇文章真的有点长,看完需要点耐心。很多读者希望能写一写 Spring AOP 的源码分析文章,这样读者看完 IOC + AOP 也就对 Spring 会有比较深的理解了。今天终于成文了,可能很多读者早就不再等待了,不过主要为了后来者吧。 本文不会像 IOC 源码分析那篇文章一样,很具体地分析每一行 Spring AOP 的源码,目标读者是已经知道 Spring IOC 源码是怎么回事的读者,因为 Spring AOP 终归是依赖于 IOC 容器来管理的。 阅读建议:1、先搞懂 IOC 容器的源码 ,AOP 依赖于 IOC 容器来管理。2、仔细看完 Spring AOP 使用介绍 这篇文章,先搞懂各种使用方式,你才能"猜到"应该怎么实现。 Spring AOP 的源码并不简单,因为它多,所以阅读源码最好就是找到一个分支,追踪下去。 本文定位为走马观花,看个大概,不具体到每一个细节。 目录: 前言 这一节,我们先来"猜猜" Spring 是怎么实现 AOP 的。 在 Spring 的容器中,我们面向的对象是一个个的 bean 实例

Ubuntu下配置内核源码树

≡放荡痞女 提交于 2020-01-24 00:34:16
最近正准备学习《Linux设备驱动程序》,需要搭建内核源码树。本打算在虚拟机上配置内核源码树,但是电脑的内存太小,分配给虚拟机更小了,使用起来很卡。最终还是决定直接在我的Ubuntu系统下直接配置,希望以后我写的驱动程序不要让系统崩溃(原先用的是UbuntuKylin,但是被我搞崩溃了,后来就装了Ubuntu和win7双系统)。 配置内核首先要下载源码,使用命令 apt-cache search linux-source 查找源码(所有截图是在win7下的VirtualBox下)。 使用命令 sudo apt-get install linux-source-3.16.0 (版本号是找到的源码的版本号)下载源码,在usr/src/ 会得到一个名为 linux-source-3.16.0.tar.bz2的压缩文件。 然后跳转路径到/usr/src/ 下使用 sudo tar jvxf linux-source-3.16.0.tar.bz2 进行解压缩。会得到一个名为linux-source-3.16.0的文件夹。 进入linux-source-3.16.0文件会看到(有一些隐藏文件没有列出来,其中有一个名为.config的文件是一些配置信息,有兴趣可以使用vi .config查看其内容) 接下来要进行配置、编译加载等(在该文件路径下,可以通过命令make help,查看其帮助信息)。

ubuntu下内核源码树的建立

假如想象 提交于 2020-01-24 00:33:27
参考的博文: http://www.360doc.com/content/12/0604/12/8890849_215794364.shtml http://www.cnblogs.com/pd520/archive/2013/02/15/2912800.html http://blog.csdn.net/feixiaoxing/article/details/8533822 1 首先安装编译内核所需要的软件 sudo apt-get install build-essential 2 查看可用的源码包 sudo apt-cache search linux-source 提示: linux-source - Linux kernel source with Ubuntu patches linux-source-3.2.0 - Linux kernel source for version 3.2.0 with Ubuntu patches 但是: liming@CM:/usr/src/linux$ uname -a Linux CM 3.8.0-32-generic #47~precise1-Ubuntu SMP Wed Oct 2 16:22:28 UTC 2013 i686 i686 i386 GNU/Linux 3 下载内核源代码 于是很纳闷,使用 apt-get

Linux 安装.src.rpm源码包的方法

ε祈祈猫儿з 提交于 2020-01-24 00:26:43
方法一:以setarch-1.3-1.src.rpm 软件包为例(可以到CSDN http://download.csdn.net/source/215173#acomment 下载 ) 假设该文件已经存在于/usr/local/src/下。在该目录下执行rpmbuild --rebuild --clean setarch-1.3-1.src.rpm 若顺利执行成功则会在/usr/src/redhat/RPMS/i386/目录下生成setarch-1.3-1.i386.rpm这个rpm文件。 接下来就是rpm的安装过程。 方法二: ( 1)rpm –ivh setarch-1.3-1.src.rpm 执行rpm安装命令 ( 2)cd /usr/src/redhat/SPECS 切换目录到/usr/src/redhat/SPECS (src.rpm包默认的解压目录) ( 3)rpmbuild –bp setarch-1.3-1 e.spec 执行rpmbuild会生成源码包 ( 4)cd /usr/src/redhat/BUILD/ setarch-1.3-1 切换到生成的源码包 ( 5)./configure 编译配置 ( 6)make 编译 ( 7)make install 安装 方法三: ( 1)rpm –ivh setarch-1.3-1 .src.rpm ( 2)cd

PX4固件源码编译中的坑

余生长醉 提交于 2020-01-23 22:54:20
我这里是使用的我自己的电脑,安装的是ubuntu16.04系统,装有ROS Kinetic,包括gazebo之类的软件已经有了,这些安装方法网上也有很多,这里不多说。 1、创建仿真环境,第一步是源码编译PX4固件: 我的飞控是pixhawk4 (1)建立工作空间,克隆固件源码 mkdir -p ~/src cd ~/src git clone https://github.com/PX4/Firmware.git cd Firmware git submodule update --init --recursive (2)在编译时候要用到交叉编译器arm-none-eabi-gcc,可以用下面命令查看其版本: arm-none-eabi-gcc --version 一般用apt-get install安装的应该都是4.3版本,但这个版本大概率是编译不成的,包括后面的很多问题,都可能是这个编译器版本的问题,现在我们通过源码安装一个新版本的: 先上官网下个新版本的 网址在此 我大概试了试,新的几个版本7-2018-q2、8-2019-q3、8-2019-q4都可,我这里用的是8-2019-q3-update这个版本,下载下来以后解压: # 解压 cd ~/Downloads tar -jxf gcc-arm-none-eabi-8-2019-q3-update-linux.tar

前后端分离【SpringBoot + FastDfs + VUE】实现百度UEditor富文本文件上传

做~自己de王妃 提交于 2020-01-23 21:00:57
1、UEditor官网下载源码 http://ueditor.baidu.com/build/build_down.php?n=ueditor&v=1_4_3_3-src 2、将源码放到项目中 引入其他jar包 <!--UEditor依赖的jar包 --> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.9</version> </dependency> 修改ConfigManager中的initEnv()方法为 private void initEnv () throws FileNotFoundException, IOException { File file = new File( this

ReentrantLock源码分析-JDK1.8

若如初见. 提交于 2020-01-23 20:28:17
浅析JDK1.8 ReentrantLock源码。 写在开篇 ReentrantLock–重入锁,是实现Lock接口的一个同步组件。这篇文章建立在熟悉AQS源码的基础上,同时主要从两个方面来分析ReentrantLock: 重入性的实现原理 公平锁和非公平锁 类的继承关系 ReentrantLock实现了Lock和Serializable接口。 public class ReentrantLock implements Lock, java.io.Serializable { 成员变量 /** ReentrantLock通过sync(AQS的子类)来实现锁 */ private final Sync sync; 这里再说明一下ReentrantLock语境下,AQS的成员变量: /** state用来表示该锁被线程重入的次数。 0表示该锁不被任何线程持有 1表示线程恰好持有该锁1次(未重入) 大于1则表示锁被线程重入state次 */ private volatile int state; /** 标识锁被哪个线程持有 */ private transient Thread exclusiveOwnerThread; 静态内部类 Sync也是一个抽象类,因为锁有非公平和公平的区别。 abstract static class Sync extends

JUC源码分析-ThreadPool-jdk6

蓝咒 提交于 2020-01-23 16:06:42
ThreadPool源码分析-jdk6 execute方法分析 public void execute(Runnable command) { if (command == null) throw new NullPointerException(); //poolSize初始值为0,先启动corePoolSize数量的线程执行 if (poolSize >= corePoolSize || !addIfUnderCorePoolSize(command)) { //poolSize==corePoolSize 后 将task加入队列 if (runState == RUNNING && workQueue.offer(command)) { if (runState != RUNNING || poolSize == 0) ensureQueuedTaskHandled(command); } //如果队列容量不够 且 poolSize < maximumPoolSize 则直接启动 else if (!addIfUnderMaximumPoolSize(command)) reject(command); // is shutdown or saturated } } private boolean addIfUnderCorePoolSize(Runnable

JUC源码分析-ThreadPool-jdk7

无人久伴 提交于 2020-01-23 15:06:16
ThreadPool源码分析-jdk7 jdk7 并发包中的线程代码被重写。 线程池中原来代表线程数的poolSize 和代表状态的state被合并到ctl中 int类型共有32位,ctl的高三位用来表示状态,剩下的28位用来表示工作线程数 private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); //可以代表工作线程数的比特位数 private static final int COUNT_BITS = Integer.SIZE - 3; //工作线程的最大容量,28位可以表示最大的数值是 2^29-1 private static final int CAPACITY = (1 << COUNT_BITS) - 1; // runState is stored in the high-order bits //将线程池状态移动到高位 29~31位表示状态值 private static final int RUNNING = -1 << COUNT_BITS; private static final int SHUTDOWN = 0 << COUNT_BITS; private static final int STOP = 1 << COUNT_BITS; private static

ThreadLocal源码解析

橙三吉。 提交于 2020-01-23 14:29:04
JDK源码如是说: ThreadLocal类用来提供线程内部的局部变量。这种变量在多线程环境下访问(通过get或set方法访问)时 能保证各个线程里的变量相对独立于其他线程内的变量。ThreadLocal实例通常来说都是 private static 类型的, 用于关联线程和线程的上下文。 1、内部存储元素采用ThreadLocalMap,其内部   1.1、Entry继承WeakReference<ThreadLocal<?>>,     方便垃圾回收key。每次get()——>getEntry()——>getEntryAfterMiss——>expungeStaleEntry删除key为null的值。   1.2、使用ThreadLocal作为key,减少Entry的key数量,提高性能。 2、使用时,继承 protected T initialValue() { return null; } 添加需要返回的对象。 建议将ThreadLocal变量定义成private static的,这样的话ThreadLocal的生命周期就更长,由于一直存在ThreadLocal的强引用,所以ThreadLocal也就不会被回收,也就能保证任何时候都能根据ThreadLocal的弱引用访问到Entry的value值,然后remove它,防止内存泄露。 ps