源码

spring AOP源码分析(一)

安稳与你 提交于 2020-01-26 06:55:44
spring AOP源码分析(一) 对于springAOP的源码分析,我打算分三部分来讲解:1.配置文件的解析,解析为BeanDefination和其他信息然后注册到BeanFactory中;2.为目标对象配置增强行为以及代理对象的生成,可以理解为AOP的准备阶段;3.代理对象调用方法,增强行为的触发执行,此时是AOP生效的阶段。我们可以把1,2理解为IOC阶段;2,3理解为AOP阶段。 我们先看第一部分:BeanDefination的解析注册过程 由一个demo进入源码分析,创建一个接口UserDao public interface UserDao { void addUser(); void deleteUser(); } 创建UserDaoImpl类 public class UserDaoImpl implements UserDao{ public void addUser() { System.out.println("add user "); } public void deleteUser() { System.out.println("delete user "); } } 创建一个Logger类 public class Logger { public void recordBefore(){ System.out.println("recordBefore"

深度Mybatis源码分析——SqlSessionFactoryBuilder(建造者模式),Mapper接口绑定原理(代理模式)

ぐ巨炮叔叔 提交于 2020-01-26 03:52:17
一: 源码分析流程图 二:源码分析开始 public class TestMyBatis { public static void main(String[] args) { try { // 基本mybatis环境 // 1.定义mybatis_config文件地址 String resources = "mybatis_config.xml"; // 2.获取InputStreamReaderIo流 Reader reader = Resources.getResourceAsReader(resources); // 3.获取SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); // 4.获取Session SqlSession sqlSession = sqlSessionFactory.openSession(); // 5.操作Mapper接口 UserMapper mapper = sqlSession.getMapper(UserMapper.class); UserEntity user = mapper.getUser(2); System.out.println(user.getName()); } catch

rpm包的rpmbuild spec文件详解

守給你的承諾、 提交于 2020-01-26 01:08:21
http://machael.blog.51cto.com/829462/213477 上一篇日志写到,为什么要制作rpm包,以及如何使用.src.rpm文件生成rpm包。最后部分还看到.src.rpm的内容,实际上 就是由.tar.gz源码、补丁软件和.spec脚本组成的。由此知道,使用.spec生成rpm包是比较简单的,因为.src.rpm通常都是由软件开 发者或者第三方的专业制作人根据源码调试好的,所以,只要处理好平台兼容性和相关的版本,不会遇到太大的问题。 但我觉得单纯明白用.spec生成rpm是不够的。常见有两个原因值得我们去了解用如何用源码制作rpm: 引用 1、并不是所有的软件都提供.rpm方式的。 这是最常见的原因。负责任的开发者应提供rpm方式的二进制软件包,以便用户选择使用。但也很常见就是软件作者只是发布了源码,最后一部分的编译和安装需要用户自行解决。我不想深究对错问题,反正知道有这样的情况就可以了; 2、自行打包一些文件或自己开发了一套软件 当 然,使用tar包或cpio等也可以打包文件,甚至比制作rpm要简单很多。但如果您想在安装的过程中就把一套额外的软件部署完毕,那使用rpm方式通常 是是唯一的方法。而且rpm还有数据库协助软件升级、文件校验等,结合yum升级方式,没有理由不选择rpm,特别是对于最终用户,我认为提供rpm包是 最佳的方法。 一

MySQL5.6.12 rpm制作及及自动化部署安装

◇◆丶佛笑我妖孽 提交于 2020-01-26 01:06:27
转自:http://blog.itpub.net/29254281/viewspace-1268918/ 首先,下载rpmbuild yum install rpm-build -y 它是Red Hat用于打RPM包的工具. 安装之后重启计算机,可以看到/root/rpmbuild目录下有如下文件夹 这个工具打包的过程大致如下, 编写spec指定打包的过程 将源码压缩包放在SOURCES目录下, 将源码解压缩到BUILD目录,执行make命令 将make install 的结果放在BUILDROOT目录下, 最后将BUILDROOT下编译好的二进制文件制作成RPM包。 并且可以指定在RPM安装之前,安装之后,卸载等过程执行的命令 首先,下载源码包 http://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.14.tar.gz 并将其复制到指定的目录 /root/rpmbuild/SOURCES/mysql-5.6.14.tar.gz 安装编译MySQL需要的依赖包 yum -y install make gcc-c++ cmake bison-devel ncurses-devel 编写spec脚本 vim mysql.spec Name: MySQL Version: 5.6.14 Release: 1%{?dist} Summary:

把mysql5.7源码包生成rpm包

别说谁变了你拦得住时间么 提交于 2020-01-26 01:03:04
公司安装服务器 boos编译安装太慢 需要把mysql5.7生成rpm包 yum install rpm* rpm-build rpmdev* yum install -y gcc make gcc-c++ cmake bison-devel ncurses ncurses-devel bzip2-devel python-devel python-libs bzip2 libicu-devel 1.建立一个普通用户,有普通用户来制作rpm,用root的可能会因为代码问题导致毁灭的后果 useradd ibuler su - ibuler 2.确定我们在哪个目录下制作RPM,通常这个目录我们topdir,这个需要在宏配置文件中指定,这个配置文件称为macrofiles,它们通常为 /usr/lib/rpm/macros:/usr/lib/rpm/macros.*:~/.rpmmacros,这个在rhel 5.8中可以通过rpmbuild --showrc | grep macrofiles 查看,6.3的我使用这个找不到,但使用是一样的。你可以通过rpmbuild --showrc | grep topdir 查看你系统默认的工作车间 rpmbuild --showrc | grep topdir -14: _builddir %{_topdir}/BUILD -14:

底层源码分析 MySQL 死锁问题

☆樱花仙子☆ 提交于 2020-01-26 00:36:03
这篇文章主要讲的是如何通过调试 MySQL 源码,知道一条 SQL 真正会拿哪些锁,不再抓虾,瞎猜或者何登成大神没写过的场景就不知道如何处理了 通过好多个深夜艰难的单步调试,终于找到了一个理想的断点,可以看到大部分获取锁的过程 代码在 lock0lock.c 的 static enum db_err lock_rec_lock() 函数中,这个函数会显示,获取锁的过程,以及获取锁成功与否的情况 对于之前何登成大神博客里面的内容( hedengcheng.com/?p=771 ), 我们来做实验逐个验证(以下介绍的都是在 RC 隔离级别下的实验) 场景1:通过主键进行删除 表结构 CREATE TABLE `t1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(10) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=InnoDB; delete from t1 where id = 10; 复制代码 可以看到,对索引 PRIMARY 加锁,mode = 1027,1027是什么意思呢?1027 = LOCK_REC_NOT_GAP + LOCK_X(非 gap 的记录锁且是 X 锁) 过程如下 结论:根据主键 id 去删除数据,且没有其它索引的情况下,此 SQL 只需要在

Linux驱动模块Makefile编写

心不动则不痛 提交于 2020-01-26 00:09:07
Linux驱动模块Makefile编写 一、序言 Linux驱动在从内核源码分离出来之后,在以模块单独编译时,需要单独的Makefile,而且PC上需要存在对应的Linux内核源码,以便Makefile指定路径供模块调用。 二、Makefile源码 export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabihf- obj-m := xxx.o KDIR ?=/home/eurphan/learn/imx6ul/kernel/linux-2.6-imx-rel_imx_4.1.15_1.2.0_ga PWD := $(shell pwd) all: make -C $(KDIR) M=$(PWD) modules clean: rm -rf *.o *~core .depend *.cmd *.ko *.mod.c *.order *.symvers 三、源码分析 前2行为环境变量设置,指定平台和交叉编译器,我们的平台为arm,交叉编译器前缀为arm-linux-gnueabihf-,如若要使用gcc编译器,则实际使用的为arm-linux-gnueabihf-gcc;第3行为设置obj-m变量,第4行设置内核路径,我们的内核存放路径为:/home/eurphan/learn/imx6ul/kernel/linux-2.6-imx

【JUC】JDK1.8源码分析之ReentrantReadWriteLock

喜欢而已 提交于 2020-01-25 22:14:52
重入锁 ReentrantLock是排他锁 ,排他锁在同一时刻仅有一个线程可以进行访问,但是在大多数场景下,大部分时间都是提供读服务,而写服务占有的时间较少。然而读服务不存在数据竞争问题,如果 一个线程在读时禁止其他线程读势必会导致性能降低 。所以就提供了读写锁。 读写锁维护着一对锁,一个读锁和一个写锁,读锁是共享锁,写锁是独占锁 。通过分离读锁和写锁,使得 并发性比一般的排他锁有了较大的提升 :在同一时间可以允许多个读线程同时访问,但是在写线程访问时,所有读线程和写线程都会被阻塞。 读写锁的主要特性: 公平性:支持公平性和非公平性。 重入性:支持重入。读写锁最多支持65535个递归写入锁和65535个递归读取锁。 锁降级:遵循获取写锁、获取读锁在释放写锁的次序,写锁能够降级成为读锁 读写锁ReentrantReadWriteLock实现接口ReadWriteLock,该接口维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有 writer,读取锁可以由多个 reader 线程同时保持。写入锁是独占的。 public interface ReadWriteLock { Lock readLock(); Lock writeLock(); } ReadWriteLock定义了两个方法。readLock()返回用于读操作的锁,writeLock()返回用于写操作的锁