Spring AOP说明
AOP(Aspect Oriented Pragraming)面向切面编程,AOP采用横向抽取机制,取代了传统纵向继承体系的重复性代码(性能监视、事务管理、安全检查、缓存)。
所谓的传统纵向继承体系是指当你需要实现某个功能的时候需要去继承某个类,而横向抽取机制则是通过使用动态代理机制产生一个与之同级的对象,然后在代理对象中进行功能增强。
Spring AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期通过代理方式向目标类织入增强代码。
Spring的AOP代理
JDK动态代理:对实现了接口的类生成代理CGLib代理机制:对类生成代理
AOP相关术语
Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点;Pointcut(切入点):所谓切入点是指我们要对哪些Joinpoint进行拦截的定义;Advice(通知/增强):所谓通知是指拦截到Joinpoint之后所要做的事情就是通知。通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能);Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field;Target(目标对象):代理的目标对象;Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程。spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入;Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类;Aspect(切面) :是切入点和通知(引介)的结合。
AOP的底层实现
前面说过AOP代理有两种,一种是JDK动态代理,用于对实现了接口的类生成代理;另一种是CGLib代理机制,用于对类生成代理。
JDK动态代理
新建一个Maven项目,名称为SpringAOP,导入Junit依赖。新建com/envy/aop/demo文件夹,新建接口文件UserDao.java,里面的代码为:
public interface UserDao { public void add(); public void update();}
以及实现类UserDaoImpl.java文件:
public class UserDaoImpl implements UserDao { public void add() { System.out.println("this is add method"); } pub