小编给大家分享一下春源码如何实现动态代理,希望大家阅读完这篇文章之后都有所收获、下面让我们一起去探讨吧!
注:这里不阐述弹簧和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 春源码如何实现动态代理