Spring有两种实现AOP的方式:Java动态代理 和 Cglib。默认使用动态代理,当目标对象没有实现接口时,就会使用后者。
代理模式中存在『目标对象』和『代理对象』,它们必须实现相同的接口。用户直接使用代理对象,而代理对象会将用户的请求交给目标对象处理。代理对象可以对用户的请求增加额外的处理。
public interface Subject   
{   
  public void doSomething();   
}  public class RealSubject implements Subject   
{   
  public void doSomething()   
  {   
    System.out.println( "call doSomething()" );   
  }   
}   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);  
    //在转调具体目标对象之后,可以执行一些功能处理
  }    
} RealSubject real = new RealSubject();   
Subject proxySubject = (Subject)Proxy.newProxyInstance(Subject.class.getClassLoader(), 
     new Class[]{Subject.class}, 
     new ProxyHandler(real));
proxySubject.doSomething();