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();