AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块。
AOP的作用是把那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。将重复的代码抽取出来(不同的模块),在需要时统一调用,可以不同的模块按不同的顺序调用,解耦。
AOP适合于那些具有横切逻辑的应用:如性能监测,访问控制,事务管理、缓存、对象池管理以及日志记录。
AOP术语
pointcut:切入点
advice:通知,是要执行的逻辑,要实现对应的接口并重写其中的方法。分为
beforeadvice,
afteradvice,不管切入点流程正常还是异常结束都执行
after returning advice,切入点流程正常结束执行
after throwing advice,切入点流程异常结束执行
arround advice
advisor(通知器):把advice和pointcut结合起来,可以定义应该使用哪个advice并在哪个pointcut使用。
AOP在java上的实现原理?
jdk动态代理,目标类实现了接口
横切前置增强和后置增强在InvocationHandler的实现类中,但是不能把增强直接显式的写入Handler中,不具有可变性。而是把前置增强接口,后置增强接口,被代理对象封装在ProxyFactory中,也叫织入器,把生成ClassLoader,Interface,InvocationHandler的代码以及Proxy.newProxyInstance的代码都放入织入器中。这样就能在外部创建不同的增强实现类,然后根据不同被代理对象生成不同的ProxyFactory,进而实现既能产生代理效果,也能在代理效果实现前后动态地插入不同的执行逻辑。
CGlib动态字节码增强,目标类没有实现接口
创建Enhencer类作为子类