源码解析

Spring查找方法注入(Lookup method injection)的底层实现原理

拟墨画扇 提交于 2019-12-06 16:16:42
美女邀我去歌舞厅娱乐,我拒绝了,我觉得跟技术宅男们分享技术更为重要。 Spring方法注入的概念:一个由容器管理的singleton bean中,需要引入另外一个由容器管理的prototype bean,由于singleton bean只会被创建一次,如何保证singleton bean每次调用时用到的prototype bean一定是prototype的呢(存在prototype被错误注入成singleton的风险)?于是,Spring提供了Method injection(方法注入)和Lookup method injection(查找方法注入),来解决此类问题。 1.错误使用 prototype的例子 public interface Command { public Object execute(); } 再定义一个实现类,prototype类型。 public class AsyncCommand implements Command { @Override public Object execute() { System.out.println("Async command execute."); return "Execute result."; } } 在一个singleton bean中使用该prototype类。 public class Manager {

Netty5_ByteToMessageDecoder_源码解析

为君一笑 提交于 2019-11-28 15:54:14
欢迎大家关注我的微博 http://weibo.com/hotbain 会将发布的开源项目技术贴通过微博通知大家,希望大家能够互勉共进!谢谢!也很希望能够得到大家对我博文的反馈,写出更高质量的文章!! ByteToMessageDecoder在Netty中起着很大的作用,用来解决半包字节累积问题。粘贴部分重要代码(当然本身方法不是很 public abstract class ByteToMessageDecoder extends ChannelHandlerAdapter { ByteBuf cumulation; private boolean singleDecode; private boolean first; protected ByteToMessageDecoder() { if (getClass().isAnnotationPresent(Sharable.class)) {//因为每一个ByteToMessageDecoder都有针对某个socket的累积对象 //故是一个不可以共享的对象类型 throw new IllegalStateException("@Sharable annotation is not allowed"); } } @Override public void channelRead(ChannelHandlerContext

Mybatis3.4.x技术内幕(十八):Mybatis之动态Sql设计原本(下)

无人久伴 提交于 2019-11-28 12:55:49
上一篇博文中,简要介绍了Mybatis动态sql的基本用法和基本设计结构,本篇博文重点阐述一些动态sql的技术细节, #{name}和${name}的区别 ,将在本篇博文中揭晓。也许读者早已了解它们之间的区别,但是,作为技术内幕,我们不仅要了解它们的区别,还要介绍它们的工作原理,是不是很开森呢? 1. #{name}和${name}的区别。 #{name}:表示这是一个参数(ParameterMapping)占位符,值来自于运行时传递给sql的参数,也就是XXXMapper.xml里的parameterType。其值通过PreparedStatement的setObject()等方法赋值。 动态sql中的<bind>标签绑定的值,也是使用#{name}来使用的。 #{name}用在sql文本中。 ${name}:表示这是一个属性配置占位符,值来自于属性配置文件,比如jdbc.properties,其值通过类似replace方法进行静态替换。比如${driver},将被静态替换为com.mysql.jdbc.Driver。 ${name}则可以用在xml的Attribute属性,还可以用在sql文本当中。 <select id="countAll" resultType="${driver}"> select count(1) from ( select stud_id as

Mybatis3.4.x技术内幕(二十):PageHelper分页插件源码及原理剖析

做~自己de王妃 提交于 2019-11-28 12:21:00
PageHelper是一款好用的开源免费的Mybatis第三方物理分页插件,其实我并不想加上好用两个字,但是为了表扬插件作者开源免费的崇高精神,我毫不犹豫的加上了好用一词作为赞美。 原本以为分页插件,应该是很简单的,然而PageHelper比我想象的要复杂许多,它做的很强大,也很彻底,强大到使用者可能并不需要这么多功能,彻底到一参可以两用。但是,我认为,作为分页插件,完成物理分页任务是根本,其它的很多智能并不是必要的,保持它够傻够憨,专业术语叫stupid,简单就是美。 我们将简单介绍PageHelper的基本使用和配置参数的含义,重点分析PageHelper作为Mybatis分页插件的实现原理。 1. PageHelper的maven依赖及插件配置 <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>4.1.6</version> </dependency> PageHelper除了本身的jar包外,它还依赖了一个叫jsqlparser的jar包,使用时,我们不需要单独指定jsqlparser的maven依赖,maven的间接依赖会帮我们引入。 <!-- com.github.pagehelper为PageHelper类所在包名 -->

Mybatis3.4.x技术内幕(十九):Mybatis之plugin插件设计原理

偶尔善良 提交于 2019-11-27 08:34:12
大多数框架,都支持插件,用户可通过编写插件来自行扩展功能,Mybatis也不例外。 我们从插件配置、插件编写、插件运行原理、插件注册与执行拦截的时机、初始化插件、分页插件的原理等六个方面展开阐述。 1. 插件配置 Mybatis的插件配置在configuration内部,初始化时,会读取这些插件,保存于Configuration对象的InterceptorChain中。 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <plugins> <plugin interceptor="com.mybatis3.interceptor.MyBatisInterceptor"> <property name="value" value="100" /> </plugin> </plugins> </configuration> public class Configuration { protected final InterceptorChain interceptorChain = new