Mybatis中mapper生成代理的过程
目录
mybatis中mapper代理的生成过程
与Spring集成时mapper代理的生成过程
与SpringBoot集成时mapper代理的生成过程
mybatis中mapper代理的生成过程构建代理类工厂从入口点开始一步一步看,首先SqlSessionFactoryBuilder类中build()方法加载配置文件
12345678910public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) { try { XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties); return build(parser.parse()); } catch (Exception e) { throw ExceptionFactory.wrapException("Error ...
Java SPI机制
少侠你现在是否还这样连接数据库
123456try { Class.forName("com.mysql.jdbc.Driver"); Connection connection = DriverManager.getConnection("URL","root","password");} catch (Exception e) { e.printStackTrace();}
少侠你知道Class.forName()这句早已经没用了么?Java 官方已经把它优化掉了。想知道怎么优化的么?不要急,且看我慢慢道来。
SPISPI 全名:Service Provider Interface,是 JDK 内置的一种服务发现机制,可以将服务接口与服务发现分离以达到解耦的效果。可以提升程序的可扩展性。比如 jdbc 只提供了接口,具体的实现由各个运营商解决、经常用的 log 日志类LogFactory,还有阿里的 dubbo 更是将 SPI 运用的淋漓尽致。 ...
Mysql优化工具explain
explain的使用很简单,只要在select语句的前面加上explain的关键字就好了,来看个例子
先创建两个表,注意两个表的索引
12345678910111213141516171819202122232425262728293031CREATE TABLE `user` ( `id` varchar(32) NOT NULL, `name` varchar(32) DEFAULT NULL, `role` varchar(32) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO `user` VALUES ('1', '1', '1');INSERT INTO `user` VALUES ('10', '10', '5');INSERT INTO `user` VALUES ('2', '2', ...
Java动态代理
JDK动态代理使用的非常广泛,Spring AOP中、MyBatis的mapper中都用到了JDK动态代理。
JDK动态代理的使用1、创建代理类接口及代理类。2、创建一个实现了InvocationHandler接口的类,实现该接口中的invoke方法。3、通过Proxy的newProxyInstance(ClassLoaderloader, Class[] interfaces, InvocationHandler h)方法创建一个代理对象。来个例子:创建一个Hello的接口
1234public interface Hello { void sayHello();}
创建一个实现了Hello接口的实现类。
123456public class HelloImpl implements Hello { public void sayHello() { System.out.println("hello"); }}
创建一个实现了InvocationHandler接口的类。
1 ...
Java内省
内省(Introspector) 是Java 语言对 JavaBean 类属性、事件的一种缺省处理方法。说简单一点就是操作JavaBean的一套API。
什么是JavaBean?javaBean只是一种规范,大家都按照约定好的一套规则写java类,既然是规范就有一定的要求:
类是public的,然后有个无参的构造函数
属性是private的,通过设置setXXX()和getXXX()来访问
能支持事件,例如 addXXXXListener(XXXEvent e), 事件可以是 Click 事件,Keyboard 事件等等
提供应该 反射机制,这样可以查看java bean的各种信息
可以序列化,可以保存在硬盘上例如:12345678910111213141516171819202122public class User { private String name; private String address; public String getName() { return name; } publi ...
ReentrantLock源码分析
ReentrantLock是一个可重入且独占式的锁,该锁支持获取锁时的公平和非公平选择。
公平锁公平锁遵循FIFO的原则,所有的线程都会顺序执行
获取锁123456789101112 //加锁 final void lock() { acquire(1); }//调用AbstractQueuedSynchronizer public final void acquire(int arg) { if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) selfInterrupt(); }
是否是获得锁,还是进入队列等待的逻辑在tryAcquire 函数里。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647protected final boolean tryAcquire(in ...
AbstractQueuedSynchronizer源码分析-独占式
独占式获得锁独占式下的顶层函数为acquire(),首先调用tryAcquire()函数获得锁,如果获取不到锁,则将线程加入到队列中。
1234567public final void acquire(int arg) { if (!tryAcquire(arg) && //尝试获得锁 //将线程加入到对列中,循环获取资源,并在一定次数后阻塞 acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) //在阻塞过程中线程可能被中断,忽略中断,在获取到锁后再进行中断。 selfInterrupt();}
addWaiter()将线程加入到阻塞队列中。
12345678910111213141516private Node addWaiter(Node mode) { //将建一个队列节点,并设置该节点为独占模式 Node node = new Node(Thread.currentThread(), mode); // 尝试快速插入 ...
AbstractQueuedSynchronizer源码分析-共享式
共享式获得锁共享式获取锁的顶层函数为acquireShared(),该函数首先调用tryAcquireShared()尝试互锁,如果获取不到锁,则将该线程加入到队列中。
1234567public final void acquireShared(int arg) { //尝试获取锁 //小于0,代表获取锁失败 // 具体的逻辑由子类实现 if (tryAcquireShared(arg) < 0) doAcquireShared(arg); }
doAcquireShared()函数将该线程加入到队列中,然后通过有限次的循环获取锁,并判断是否该阻塞
12345678910111213141516171819202122232425262728293031323334353637383940private void doAcquireShared(int arg) { //将该线程加入到队列中 final Node node = addWait ...