乐趣区

关于java:六AOP设计思想

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();
退出移动版