AOP思维
- AOP是对OOP的一种补充
- 面对对象(OOP)引入了继承、多态、封装、将零碎的业务性能依照模块划分,每个模块用一个或多个类来示意。
- 而对于一些零碎性能,无奈应用OOP的思维来实现它们。这些零碎性能往往穿插在业务性能的各处,和业务代码耦合在一起;而且零碎性能往往会被重复使用,这就导致了模块不利于复用,这就是应用OOP实现零碎性能的弊病。
- AOP即为面向切面编程,它把零碎需要依照性能分门归类,把她们封装在一个个切面中,而后再指定这些零碎性能往业务性能中织入的规定。最初由第三方机构依据你指定的织入规定,将零碎性能正和到业务性能中。
AOP的基本概念
- 切面(Aspect):相似于OOP中的Class,以恶搞Aspect寄存一个零碎性能的所有逻辑;在ApplicationContext中由aop:aspect来配置;
- 连接点(Joinpoint):程序执行过程中的某一事件,如办法被调用、抛出异样时;
- 切入点(Pointcut):它是一个表达式,用于确定哪些类的哪些函数须要插入横切逻辑;它只准确到函数,到底要在函数执行的哪个阶段横切逻辑,这就由告诉的类型决定;
告诉(Advice):具体的横切逻辑,Spring中有四种Advice
- 前置告诉(Before Advice)
- 后置告诉(After Advice)
- 返回告诉(After Return Advice)
- 盘绕告诉(Around Advice)
- 抛出异样后告诉(After Throwing Advice)
动静代理
Spring有两种实现AOP的形式:Java动静代理和Cglib。默认应用动静代理,当指标对象没有实现接口时,就会应用后者。
代理模式中存在指标对象和代理对象,它们必须实现雷同的接口。用户间接应用代理对象,而代理对象会将用户的申请交给指标对象解决。代理对象能够对用户的申请减少额定的解决。
jdk动静代理简略例子
1.创立指标对象
//指标对象接口public interface Subject { public void doSomething(); } //指标对象实现public class RealSubject implements Subject { public void doSomething() { System.out.println( "call doSomething()" ); } }
2.创立代理对象逻辑解决类
public class ProxyHandler implements InvocationHandler { private Object proxied; public ProxyHandler( Object proxied ) { this.proxied = proxied; } public Object invoke( Object proxy, Method method, Object[] args ) throws Throwable { //在转调具体指标对象之前,能够执行一些性能解决 //转调具体指标对象的办法 return method.invoke( proxied, args); //在转调具体指标对象之后,能够执行一些性能解决 } }
3.简略调用,创立代理对象
RealSubject real = new RealSubject(); Subject proxySubject = (Subject)Proxy.newProxyInstance(Subject.class.getClassLoader(), new Class[]{Subject.class}, new ProxyHandler(real));proxySubject.doSomething();