春源码如何实现动态代理

  介绍

小编给大家分享一下春源码如何实现动态代理,希望大家阅读完这篇文章之后都有所收获、下面让我们一起去探讨吧!

注:这里不阐述弹簧和AOP的一些基本概念和用法,直接进入正题。

流程

? ?春天所管理的对象大体会经过确定实例化对象类型,推断构造方法创建对象(实例化),设置属性,初始化等等步骤。在对象初始化阶段,春天为开发者提供了一个BeanPostProcessor接口,它会在对象初始化之前和初始化之后被调用(初始化,不是实例化,对应实例化的是InstantiationAwareBeanPostProcessor接口)。

public  interface  BeanPostProcessor  {//初始化之前   Object  postProcessBeforeInitialization (Object  bean, String  beanName), throws  BeansException;//初始化之后   Object  postProcessAfterInitialization (Object  bean, String  beanName), throws  BeansException;      }

? ?在对象初始化之后会调用postProcessAfterInitialization方法,该方法返回一个对象。如果成功返回了一个对象,那么容器中相应beanName对应的实例就将会是这个对象。

? ?本文主要分析动态代理,我们着重看AnnotationAwareAspectJAutoProxyCreator。先来看一下它的继承关系:

按涸绰肴绾问迪侄?

? ? AnnotationAwareAspectJAutoProxyCreator最终实现了BeanPostProcessor接口(也实现了InstantiationAwareBeanPostProcessor接口),可以看到继承关系比较复杂。当前我们关注的postProcessAfterInitialization方法实现在它的父类AbstractAutoProxyCreator中(只保留了部分代码):

public  Object  postProcessAfterInitialization (Object  bean, String  beanName), throws  BeansException  {   if  (bean  !=, null), {   Object  cacheKey =, getCacheKey (bean.getClass (),, beanName);   if  (! this.earlyProxyReferences.contains (cacheKey)), {   return  wrapIfNecessary (bean, beanName,, cacheKey);   }   }   return 豆类;   }

? ?这里主要看看wrapIfNecessary方法(只保留了部分代码):

Object [], specificInterceptors =, getAdvicesAndAdvisorsForBean (bean.getClass (),, beanName,, null);   ……   时间=对象[],specificInterceptors  getAdvicesAndAdvisorsForBean (bean.getClass (),, beanName,, null);   if  (specificInterceptors  !=, DO_NOT_PROXY), {   this.advisedBeans.put (cacheKey, Boolean.TRUE);   Object  proxy =, createProxy (bean.getClass (),, beanName,, specificInterceptors,, new  SingletonTargetSource (bean));   this.proxyTypes.put (cacheKey, proxy.getClass ());   return 代理;   }   ……   }

? ?其中核心的是两个方法调用,分别是getAdvicesAndAdvisorsForBean和createProxy.getAdvicesAndAdvisorsForBean会返回一个对象数组,包含aop相关的一些对象,如果是一个普通的不需要代理的对象会返回一个空对象数组,也就是DO_NOT_PROXY; createProxy方法则是创建代理类。

? ?先看看getAdvicesAndAdvisorsForBean方法:

protected  abstract 对象[],getAdvicesAndAdvisorsForBean (Class<?祝辞,beanClass,, String  beanName,, TargetSource  customTargetSource), throws  BeansException;

? ?getAdvicesAndAdvisorsForBean方法在当前类(AbstractAutoProxyCreator)中是一个抽象方法,由子类AbstractAdvisorAutoProxyCreator实现:

public  abstract  class  AbstractAdvisorAutoProxyCreator  extends  AbstractAutoProxyCreator  {   @Override   protected 对象[],getAdvicesAndAdvisorsForBean (Class<?祝辞,beanClass,, String  beanName,, TargetSource  targetSource), {   List

? ?代码很清晰,我们进入findEligibleAdvisors方法,看方法名也知道它会完成寻找顾问的工作:

protected  List, findEligibleAdvisors (Class<?祝辞,beanClass,, String  beanName), {//寻找顾问   List春源码如何实现动态代理