<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[jacobbbbbbbb的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/jacobbbbbbbb</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; jacobbbbbbbb]]></copyright><item><title><![CDATA[JDK动态代理与Cglib代理的深度分析]]></title><link>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/109689292</link><guid>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/109689292</guid><author>jacobbbbbbbb</author><pubDate>Sat, 14 Nov 2020 16:59:34 +0800</pubDate><description><![CDATA[JDK动态代理与Cglib代理的深度分析
一.JDK动态代理原理
JDK动态代理首先根据需要代理类的接口、类加载以及handler来生成动态代理类：
public static Object newProxyInstance(ClassLoader loader,Class&lt;?&gt;[] interfaces,InvocationHandler h)

其中的最主要逻辑是：
//生成字节码
byte[] proxyClassFile = ProxyGenerator.generateProxyCla]]></description><category></category></item><item><title><![CDATA[Java设计模式总结]]></title><link>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/109390758</link><guid>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/109390758</guid><author>jacobbbbbbbb</author><pubDate>Sat, 31 Oct 2020 16:54:14 +0800</pubDate><description><![CDATA[Java设计模式总结
一.七大原则
1.单一职责原则
一个类应该只负责一项职责（只有类逻辑足够简单，并且类中数量足够少才可违反）。
2.接口隔离原则
不应该依赖它不需要的接口，一个类对另外一个类的依赖建立在最小的接口上。
3.依赖倒转原则
中心思想是面向接口编程。高层模块不应该依赖低层模块，都应该依赖其抽象。
抽象（接口，抽象类）不应该依赖细节（具体实现类），细节应该依赖抽象。
4.里氏替换原则
所有引用基类的地方必须能透明地使用其子类的对象。
子类中尽量不要重写父类方法。
尽量不要继承，用聚合、组合、依赖]]></description><category></category></item><item><title><![CDATA[Netty组件源码解析（4）]]></title><link>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/107301736</link><guid>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/107301736</guid><author>jacobbbbbbbb</author><pubDate>Mon, 13 Jul 2020 17:26:34 +0800</pubDate><description><![CDATA[SelectedSelectionKeySet  继承AbstractSet抽象类，已经select的NIO SelectionKey集合
final class SelectedSelectionKeySet extends AbstractSet&lt;SelectionKey&gt; {
	//Selectionkey数组
    SelectionKey[] keys;
    //数组可读大小
    int size;

    SelectedSelectionKeySet() {
     ]]></description><category></category></item><item><title><![CDATA[Netty组件源码解析（3）]]></title><link>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/107270901</link><guid>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/107270901</guid><author>jacobbbbbbbb</author><pubDate>Sun, 12 Jul 2020 14:25:05 +0800</pubDate><description><![CDATA[SingleThreadEventLoop  基于单线程的EventLoop抽象类，将Channel注册到EventLoop上
public abstract class SingleThreadEventLoop extends SingleThreadEventExecutor implements EventLoop {
	//默认任务队列最大数量
    protected static final int DEFAULT_MAX_PENDING_TASKS = Math.max(16,
     ]]></description><category></category></item><item><title><![CDATA[Netty组件源码解析（2）]]></title><link>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/107248347</link><guid>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/107248347</guid><author>jacobbbbbbbb</author><pubDate>Fri, 10 Jul 2020 22:06:12 +0800</pubDate><description><![CDATA[三.EventLoop
类图

EventExecutor   继承EventExecutorGroup接口，事件执行器接口
public interface EventExecutor extends EventExecutorGroup {
	//返回自己
    @Override
    EventExecutor next();
	//当前线程所处的EventExecutorGroup
    EventExecutorGroup parent();
	//当前线程是否在EventLoop线程中
]]></description><category></category></item><item><title><![CDATA[Netty组件源码解析（1）]]></title><link>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/107221779</link><guid>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/107221779</guid><author>jacobbbbbbbb</author><pubDate>Fri, 10 Jul 2020 12:30:16 +0800</pubDate><description><![CDATA[一.Bootstrap
这是Netty中的配置类，也是程序开始的组件。
AbstractBootstrap是BootStrap和ServerBootStrap的父类抽象类
public abstract class AbstractBootstrap&lt;B extends AbstractBootstrap&lt;B, C&gt;, C extends Channel&gt; implements Cloneable {
    @SuppressWarnings("unchecked")
    st]]></description><category></category></item><item><title><![CDATA[NIO组件源码解析]]></title><link>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/107203666</link><guid>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/107203666</guid><author>jacobbbbbbbb</author><pubDate>Wed, 08 Jul 2020 21:55:56 +0800</pubDate><description><![CDATA[一.Channel
public interface Channel extends Closeable {
	//判断此通道是否处于打开状态
    public boolean isOpen();
	//关闭此通道
    public void close() throws IOException;
}

四个主要的实现类：
1.SocketChannel，客户端发起TCP的Channel
//客户端通道，主要两种方式可以创建SocketChannel，一种是打开一个SocketChannel并且连接]]></description><category></category></item><item><title><![CDATA[Spring事务源码解析（2）]]></title><link>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/107183779</link><guid>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/107183779</guid><author>jacobbbbbbbb</author><pubDate>Tue, 07 Jul 2020 21:00:58 +0800</pubDate><description><![CDATA[处理已经存在的事务
private TransactionStatus handleExistingTransaction(
			TransactionDefinition definition, Object transaction, boolean debugEnabled)
			throws TransactionException {
//如果是never模式就抛出错误
		if (definition.getPropagationBehavior() == TransactionDefinit]]></description><category></category></item><item><title><![CDATA[Spring事务源码解析（1）]]></title><link>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/107168381</link><guid>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/107168381</guid><author>jacobbbbbbbb</author><pubDate>Tue, 07 Jul 2020 16:08:17 +0800</pubDate><description><![CDATA[本文主要从注解式配置入手，例如@Transactional(propagation=Propagation.REQUIRED),而分析的逻辑开始部分是在
&lt;tx:annotation-driver transaction-manager="transactionManager"/&gt;

这是自定义标签实现在TxNamespaceHandler：
    public void init() {
        this.registerBeanDefinitionParser("advice", ]]></description><category></category></item><item><title><![CDATA[Spring整合Mybatis源码分析]]></title><link>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/107115393</link><guid>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/107115393</guid><author>jacobbbbbbbb</author><pubDate>Sat, 04 Jul 2020 13:40:29 +0800</pubDate><description><![CDATA[SqlSessionFactoryBean
//实现 FactoryBean、InitializingBean、ApplicationListener 接口
public class SqlSessionFactoryBean
    implements FactoryBean&lt;SqlSessionFactory&gt;, InitializingBean, ApplicationListener&lt;ApplicationEvent&gt; {
  private static final Lo]]></description><category></category></item><item><title><![CDATA[MyBatis源码解析--加载流程（11）]]></title><link>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/107100185</link><guid>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/107100185</guid><author>jacobbbbbbbb</author><pubDate>Fri, 03 Jul 2020 13:59:17 +0800</pubDate><description><![CDATA[接下来分析接口层，首先从SqlSession接口开始：
public interface SqlSession extends Closeable {
  //泛型方法，经过查询返回一个指定的对象
  &lt;T&gt; T selectOne(String statement);
  //根据传入的条件查询结果
  &lt;T&gt; T selectOne(String statement, Object parameter);

  //经过查询，返回泛型集合
  &lt;E&gt; List&lt;]]></description><category></category></item><item><title><![CDATA[MyBatis源码解析--加载流程（10）]]></title><link>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/107034615</link><guid>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/107034615</guid><author>jacobbbbbbbb</author><pubDate>Fri, 03 Jul 2020 10:18:33 +0800</pubDate><description><![CDATA[//继续DefaultResultSetHandler
//创建数据库映射的结果对象
private Object createResultObject(ResultSetWrapper rsw, ResultMap resultMap, ResultLoaderMap lazyLoader, String columnPrefix) throws SQLException {
//标识是否使用构造函数创建该结果对象
    this.useConstructorMappings = false; 
   ]]></description><category></category></item><item><title><![CDATA[MyBatis源码解析--加载流程（9）]]></title><link>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/106982587</link><guid>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/106982587</guid><author>jacobbbbbbbb</author><pubDate>Fri, 03 Jul 2020 10:18:15 +0800</pubDate><description><![CDATA[ResultSetHandler 会将查询结果的ResultSet转换成映射的对应结果
ResultSetWrapper
public class ResultSetWrapper {
//ResultSet对象	
  private final ResultSet resultSet;
  private final TypeHandlerRegistry typeHandlerRegistry;
  //字段名称的数组
  private final List&lt;String&gt; columnN]]></description><category></category></item><item><title><![CDATA[MyBatis源码解析--加载流程（8）]]></title><link>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/106978475</link><guid>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/106978475</guid><author>jacobbbbbbbb</author><pubDate>Sat, 27 Jun 2020 14:32:10 +0800</pubDate><description><![CDATA[上篇讲完了Executor接口及其实现类，接下来分析StatementHandler，这是Executor用来处理Statement的。
首先是StatementHandler的接口
public interface StatementHandler {

 //从连接中获取一个Statement
  Statement prepare(Connection connection, Integer transactionTimeout)
      throws SQLException;

  //占位符]]></description><category></category></item><item><title><![CDATA[MyBatis源码解析--加载流程（7）]]></title><link>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/106968757</link><guid>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/106968757</guid><author>jacobbbbbbbb</author><pubDate>Fri, 26 Jun 2020 23:12:09 +0800</pubDate><description><![CDATA[SimpleExecutor
前面已经介绍了BaseExecutor，是Executor接口的直接继承，作用是提供模版，为它的继承类可以直接继承方法，其中SimpleExecutor会不需要关心一级缓存的问题，只要实现四个基本方法就可以。
public class SimpleExecutor extends BaseExecutor {

  public SimpleExecutor(Configuration configuration, Transaction transaction) {
    ]]></description><category></category></item><item><title><![CDATA[MyBatis源码解析--加载流程（6）]]></title><link>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/106860652</link><guid>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/106860652</guid><author>jacobbbbbbbb</author><pubDate>Fri, 26 Jun 2020 12:57:37 +0800</pubDate><description><![CDATA[BoundSql     一次可执行的SQL封装
public class BoundSql {
//SQL语句
  private final String sql;
  //ParameterMapping 数组
  private final List&lt;ParameterMapping&gt; parameterMappings;
  //参数对象
  private final Object parameterObject;
  //附加的参数集合
  private final Map&lt]]></description><category></category></item><item><title><![CDATA[MyBatis源码解析--加载流程（5）]]></title><link>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/106854430</link><guid>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/106854430</guid><author>jacobbbbbbbb</author><pubDate>Fri, 19 Jun 2020 17:24:37 +0800</pubDate><description><![CDATA[StaticTextSqlNode  静态文本的SqlNode实现类
public class StaticTextSqlNode implements SqlNode {
//静态文本
  private final String text;

  public StaticTextSqlNode(String text) {
    this.text = text;
  }

  @Override
  //直接拼接到context中
  public boolean apply(DynamicCon]]></description><category></category></item><item><title><![CDATA[MyBatis源码解析--加载流程（4）]]></title><link>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/106783200</link><guid>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/106783200</guid><author>jacobbbbbbbb</author><pubDate>Fri, 19 Jun 2020 13:15:37 +0800</pubDate><description><![CDATA[接下来是解析sql语句，对应的是scripting包，实现了动态SQL语句的功能。
LanguageDriver  语言驱动接口
public interface LanguageDriver {
//创建ParameterHandler对象
  ParameterHandler createParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql);
//创建sqlSource，从]]></description><category></category></item><item><title><![CDATA[MyBatis源码解析--加载流程（4）]]></title><link>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/106760372</link><guid>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/106760372</guid><author>jacobbbbbbbb</author><pubDate>Mon, 15 Jun 2020 16:52:53 +0800</pubDate><description><![CDATA[接下来是注解配置的解析，入口是MapperRegistry.addMapper
public &lt;T&gt; void addMapper(Class&lt;T&gt; type) {
//首先判断必须是接口
    if (type.isInterface()) {
        if (hasMapper(type)) {
          throw new BindingException("Type " + type + " is already known to the MapperRe]]></description><category></category></item><item><title><![CDATA[MyBatis源码解析--加载流程（3）]]></title><link>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/106751726</link><guid>https://blog.youkuaiyun.com/jacobbbbbbbb/article/details/106751726</guid><author>jacobbbbbbbb</author><pubDate>Mon, 15 Jun 2020 11:29:34 +0800</pubDate><description><![CDATA[MapperBuilderAssistant  继承BaseBuilder抽象类，提供了一些公用的方法
public class MapperBuilderAssistant extends BaseBuilder {
//当前Mapper命名空间
  private String currentNamespace;
  //资源引用的地址
  private final String resource;
  //当前的Cache对象
  private Cache currentCache;
  //是否]]></description><category></category></item></channel></rss>