AbstractQueue
BlockingQueue
Queue
FutureTask
Aop概述
概述
AOP是Aspect Oriented Program的首字母缩写,翻译成中文为面向切面编程。java是面向对象(OOP)的编程语言,面向对象的特点是继承、封装和多态。而封装就要求将功能分散到不同的对象中去,这在软件设计中往往称为职责分配。实际上也就是说,让不同的类设计不同的方法。这样代码就分散到一个个的类中去了。这样做的好处是降低了代码的复杂程度,使类可重用。但是随着业务越来越复杂会发现程序中很多类都存在重复的代码,例如每个类中都会存在那种打印方法的入参、结果、耗时这种日志代码。这时比较聪明的工程师就会编写一个日志工具类然后在需要打印日志的方法中调用该工具类,或者是编写一个打印日志父类让需要打印日志的类继承该类,但是由于java只允许单继承,如果这个类需要扩展新功能就会变得很棘手。纵观上面两种方法无论是编写工具类还是继承父类就会将业务类与其耦合在一起,随着业务越来越复杂最终业务类就很有可能变得很难维护。那有没有一种方式能够动态的给类添加功能呢?答案是肯定的,这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。 我们可以将那些额外功能的代码编写成一个切面,等需要时再切入到对象之中。由此看来AOP其实是对OOP的一个补充,OOP将一个功能分割成多个对象,而AOP则提供切面为这些对象提供额外的功能。并且从技术角度来看aop基本上都是基于代理模式来实现的,也就是在运行时基于原始对象的特性选择jdk动态代理(生成目标对象实现接口的实现类)、cglib(基于asm库生成目标对象的子类)等方式来动态给对象添加功能。
Jdk动态代理
概述
在阐述jdk动态代理背后的原理前我们有必要先了解一下代理的概念和分类。代理是指假如现在有一件事情需要我去做,但是我现在很忙没有空,此时我委托其他人代替我去做,例如我委托张三去帮我做。在这个过程中张三就起到了一个代理的作用,张三是代替我去做某件事情的。同时代理又分静态代理和动态代理两种。静态代理是指在做某件事情的过程前这个代理人就已经分配好了。而动态代理则是在做某件事情时代理人是动态分配的。动态代理相比于静态代理的优势在于做某件事情的时候是能够动态生成代理人,如果需要代理的对象很多,那么为每一个代理对象都提前分配一个代理人这是一件很麻烦也不好扩展的,此时动态代理相比于静态代理的优势就显现出来了。