Spring Boot之AOP原理实现

Aop实现原理:拦截器+动态代理
Aop要做的事情:在真正的对象代码执行之前,做点什么,执行完之后,再做点什么,废话不多说,直接从代码开始讲起

ProxyBean的现实:

  • 第一步:动态代理

    • JDK提供了·类Proxy:包含newProxyInstance方法
public statistic Object newProxyInstance(ClassLoader classLoadeer,Class<?>[] interface,InvocationHandler invocationHangler);//生成一个代理对象
  • ClassLoader:类加载器

  • interfaces:绑定的接口,也就是把代理对象绑定到哪些接口下,可以是多个

  • invocationhandler:绑定代理对象逻辑实现

  • invocationHandler对象定义了一个invoke方法:

public Object invoke(Object proxy,Method method,Object[] args){
    System.out.println("进入代理逻辑方法");
    System.out.println("在调度真实对象之前的服务");
    Object obj=method.invoke(target,args);//通过反射实现,调度真实对象
}

补充: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 详情见 https://www.jianshu.com/p/9be58ee20dee

  • 第二部分拦截器:

    1 Intercepter:拦截器接口

 public interface Intercepter{
     //事前方法
     public boolean before();
     
     //事后方法
     public void after();
     
     /**
     *取代原有事情方法
     * @param invocation --回调参数,可以通过它的proceed方法,回调原有事件
     * @return 原有事件返回对象
     */
     public Object arround(Invocation invocation);
     
     //是否返回方法,事件没有异常时执行
     public void afterReturning();
     
     //时候异常方法,事件异常时执行
     public void afterThrowing();
     
     //是否使用around取代原有方法
     boolean useAround();
     
     
 }

2 invocation

   public class invocation{
       private Object[] param ;
       private Method method;
       private Object target;
       
       public Invocation(Object[] param,Method method,Object target){
          .....//构造函数
       }
       //反射方法
       public Object proceed() Throws Exception{
           return method.invoke(target,param);//以反射的形式去调用原有的方法
       }
           
   }

3 ProxyBean

Public class ProxyBean implement InvocationHandler{
    private Object target;//被代理对象
    private Interceptor interceptor=null;//拦截器
    
    //生成一个代理对象
    public statistic Object getProxyBean(Obeject targer,Interceptor interceptor){
        ProxyBean proxyBean=new ProxyBean();
        proxyBean.target=target;
        proxyBean.interceptor=interceptor;
        //生成代理对象
        Object proxy=Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),proxyBean);
        return proxy
    }
    
    //处理代理对象方法逻辑
    @Override
    public Object invoke(Object proxy,Method method,Object[] args){
        //异常标志
        boolean exceptionFlag=false;
        Invocation invocation=new Invocation(target,method,args);
        Object retobj=null;
        
        try{
            if(this.intercepter.before()){
                retobj=this.interceptor.aroud(invocation);
            }else{
                retObj=method.invoke(target,args);
            }
        }catch(Exception e){
            exceptionFlag=true;
        }
        this.interceptor.after();
        if(exceptionFlag){
            this.interceptor.afterThrowing();
        }else{
              this.interceptor.afterReturning();
              return retObj;
        }
        return null;
    }
}
  • 说明:

    • 利用newProxyInstance()生成一个与被代理对象绑定了的代理对象
    • 实现InvocationHandler的invoke方法
  • AOP:以上就是AOP的原理,一种约定流程的编程,将代码切开,植入一些我们需要的处理。比如我们可以拦截所有的业务代码,将他们统一的非业务切割出来,让代理去实现,这样开发者就可以专心于业务代码,其他的杂事都让代理去处理了。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容