欢迎访问我的个人博客休息的风
spring aop的实现,主要通过注册InstantiationAwareBeanPostProcessor处理器,在创建bean时判断是否需要
增强。具体的注册在AbstractApplicationContext.registerBeanPostProcessors方法中将所有的
BeanPostProcessor注册到容器的beanPostProcessors中。其中对aop增强主要的
InstantiationAwareBeanPostProcessor处理器是AnnotationAwareAspectJAutoProxyCreator。整个spring aop的具体
实现大致过程为:InstantiationAwareBeanPostProcessor处理器实例化前置处理器和初始化后置处理器作为入口->
查找所有的Advisor通知器->筛选能应该于该类的Advisor通知器->根据配置选择jdk还是cglib代理->代理调用时,
通过Advisor通知器链进行拦截调用,这一过程就实现了对类的aop增强。
它的整个类图关系如下:(看不清,可在右击新标签页查看)
从上图可以看到,具体实现InstantiationAwareBeanPostProcessor是AbstractAutoProxyCreator抽象类。
这个类的实例化前置处理器和初始化后置处理器就是aop增强的入口。
public Object postProcessBeforeInstantiation(Class> beanClass, String beanName) throws BeansException { Object cacheKey = getCacheKey(beanClass, beanName); if (!StringUtils.hasLength(beanName) || !this.targetSourcedBeans.contains(beanName)) { if (this.advisedBeans.containsKey(cacheKey)) { return null; } //isInfrastructureClass判断是否是aop增强处理的类 //shouldSkip判断当前类是否为advice类 //其实就是判断当前bean是否需要用aop定义的增加类进行增加 if (isInfrastructureClass(beanClass) || shouldSkip(beanClass, beanName)) { this.advisedBeans.put(cacheKey, Boolean.FALSE); return null; } }
public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) throws BeansException { if (bean != null) { Object cacheKey = getCacheKey(bean.getClass(), beanName); if (!this.earlyProxyReferences.contains(cacheKey)) { //在这里进行判断是否需要织入增加,并且构造Advisor通知器 return wrapIfNecessary(bean, beanName, cacheKey); } } return bean; }
初始化后置处理器会去看是否需要包装,也就是是否需织入通知器进行增强。
protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) { if (StringUtils.hasLength(beanName) && this.targetSourcedBeans.contains(beanName)) { return bean; } //与前置处理器呼应,advisedBeans相同的cacheKey在前置处理器时有设置为false则直接返回 if (Boolean.FALSE.equals(this.advisedBeans.get(cacheKey))) { return bean; } if (isInfrastructureClass(bean.getClass()) || shouldSkip(bean.getClass(), beanName)) { this.advisedBeans.put(cacheKey, Boolean.FALSE); return bean; } // Create proxy if we have advice. //获取与类匹配的增强通知器 Object[] 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 proxy; } this.advisedBeans.put(cacheKey, Boolean.FALSE); return bean; }
在getAdvicesAndAdvisorsForBean方法中,会去构造aop有增强作用的通知器链。
protected Object[] getAdvicesAndAdvisorsForBean(Class> beanClass, String beanName, @Nullable TargetSource targetSource) { //发现合格的Advisor器集合 Listadvisors = findEligibleAdvisors(beanClass, beanName); if (advisors.isEmpty()) { return DO_NOT_PROXY; } return advisors.toArray(); }
protected ListfindEligibleAdvisors(Class> beanClass, String beanName) { //找出所有的Advisor通知器集合 List candidateAdvisors = findCandidateAdvisors(); //过滤出可以应用到该beanClass的Advisor通知器集合 List eligibleAdvisors = findAdvisorsThatCanApply(candidateAdvisors, beanClass, beanName); //通知器扩展 extendAdvisors(eligibleAdvisors); if (!eligibleAdvisors.isEmpty()) { //对通知器进行排序 eligibleAdvisors = sortAdvisors(eligibleAdvisors); } //返回通知器链 return eligibleAdvisors; }
查找所有的通知器,委托advisorRetrievalHelper.findAdvisorBeans去完成
public ListfindAdvisorBeans() { // Determine list of advisor bean names, if not cached already. String[] advisorNames = null; synchronized (this) { advisorNames = this.cachedAdvisorBeanNames; if (advisorNames == null) { // Do not initialize FactoryBeans here: We need to leave all regular beans // uninitialized to let the auto-proxy creator apply to them! //获取容器中所有的Advisor类的名称 advisorNames = BeanFactoryUtils.beanNamesForTypeIncludingAncestors( this.beanFactory, Advisor.class, true, false); this.cachedAdvisorBeanNames = advisorNames; } } //省略代码 。。。。 try { //在容器里面获取通知器类,加入到通知器集合 advisors.add(this.beanFactory.getBean(name, Advisor.class)); }
而找出应用到该beanClass的Advisor通知器集合则是在AopUtils.findAdvisorsThatCanApply方法中实现。
public static ListfindAdvisorsThatCanApply(List candidateAdvisors, Class> clazz) { if (candidateAdvisors.isEmpty()) { return candidateAdvisors; } List eligibleAdvisors = new LinkedList<>(); for (Advisor candidate : candidateAdvisors) { //遍历通知器,处理IntroductionAdvisor类型的通知,是否可以应用到该类 if (candidate instanceof IntroductionAdvisor && canApply(candidate, clazz)) { eligibleAdvisors.add(candidate); } } //处理所有通知器链中不是IntroductionAdvisor类型的部分 boolean hasIntroductions = !eligibleAdvisors.isEmpty(); for (Advisor candidate : candidateAdvisors) { if (candidate instanceof IntroductionAdvisor) { // already processed continue; } if (canApply(candidate, clazz, hasIntroductions)) { eligibleAdvisors.add(candidate); } } return eligibleAdvisors; }
判断是否可以应用到该类
public static boolean canApply(Advisor advisor, Class> targetClass, boolean hasIntroductions) { if (advisor instanceof IntroductionAdvisor) { return ((IntroductionAdvisor) advisor).getClassFilter().matches(targetClass); } else if (advisor instanceof PointcutAdvisor) { PointcutAdvisor pca = (PointcutAdvisor) advisor; return canApply(pca.getPointcut(), targetClass, hasIntroductions); } else { // It doesn't have a pointcut so we assume it applies. return true; } }
其中,如果是PointcutAdvisor类型的通知器,则是通过切入点的MethodMatcher判断是否匹配的。
public static boolean canApply(Pointcut pc, Class> targetClass, boolean hasIntroductions) { Assert.notNull(pc, "Pointcut must not be null"); if (!pc.getClassFilter().matches(targetClass)) { return false; } MethodMatcher methodMatcher = pc.getMethodMatcher(); //省略一些代码。。。 Set> classes = new LinkedHashSet<>(ClassUtils.getAllInterfacesForClassAsSet(targetClass)); classes.add(targetClass); for (Class> clazz : classes) { Method[] methods = ReflectionUtils.getAllDeclaredMethods(clazz); for (Method method : methods) { //判断目标类的方法是否与该切入点匹配 if ((introductionAwareMethodMatcher != null && introductionAwareMethodMatcher.matches(method, targetClass, hasIntroductions)) || methodMatcher.matches(method, targetClass)) { return true; } } }
至此,构建合格的通知器链成功。返回这个通知器链之后,会去创建代理,返回bean的代理。
protected Object createProxy(Class> beanClass, @Nullable String beanName, @Nullable Object[] specificInterceptors, TargetSource targetSource) { if (this.beanFactory instanceof ConfigurableListableBeanFactory) { AutoProxyUtils.exposeTargetClass((ConfigurableListableBeanFactory) this.beanFactory, beanName, beanClass); } ProxyFactory proxyFactory = new ProxyFactory(); proxyFactory.copyFrom(this); if (!proxyFactory.isProxyTargetClass()) { if (shouldProxyTargetClass(beanClass, beanName)) { proxyFactory.setProxyTargetClass(true); } else { evaluateProxyInterfaces(beanClass, proxyFactory); } } //构建通知器链 Advisor[] advisors = buildAdvisors(beanName, specificInterceptors); proxyFactory.addAdvisors(advisors); proxyFactory.setTargetSource(targetSource); customizeProxyFactory(proxyFactory); proxyFactory.setFrozen(this.freezeProxy); if (advisorsPreFiltered()) { proxyFactory.setPreFiltered(true); } //通过代理工厂创建代理类 return proxyFactory.getProxy(getProxyClassLoader()); }
在创建代理类里,有两种方式,一种是cglib,一种里jdk代理。选择哪种代理,在DefaultAopProxyFactory的
createAopProxy方法中
public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException { if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) { Class> targetClass = config.getTargetClass(); if (targetClass == null) { throw new AopConfigException("TargetSource cannot determine target class: " + "Either an interface or a target is required for proxy creation."); } //使用jdk代理 if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) { return new JdkDynamicAopProxy(config); } //使用cglib代理 return new ObjenesisCglibAopProxy(config); } else { //使用jdk代理 return new JdkDynamicAopProxy(config); } }
使用cglib创建代理
public Object getProxy(@Nullable ClassLoader classLoader) { //省略代码。。。。 // Configure CGLIB Enhancer... Enhancer enhancer = createEnhancer(); if (classLoader != null) { enhancer.setClassLoader(classLoader); if (classLoader instanceof SmartClassLoader && ((SmartClassLoader) classLoader).isClassReloadable(proxySuperClass)) { enhancer.setUseCache(false); } } enhancer.setSuperclass(proxySuperClass); enhancer.setInterfaces(AopProxyUtils.completeProxiedInterfaces(this.advised)); enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE); enhancer.setStrategy(new ClassLoaderAwareUndeclaredThrowableStrategy(classLoader)); //根据advised创建callbacks Callback[] callbacks = getCallbacks(rootClass); Class>[] types = new Class>[callbacks.length]; for (int x = 0; x < types.length; x++) { types[x] = callbacks[x].getClass(); } // fixedInterceptorMap only populated at this point, after getCallbacks call above //创建CallbackFilter,用于对目标类的每个方法选择对应的callback enhancer.setCallbackFilter(new ProxyCallbackFilter( this.advised.getConfigurationOnlyCopy(), this.fixedInterceptorMap, this.fixedInterceptorOffset)); enhancer.setCallbackTypes(types); // Generate the proxy class and create a proxy instance. return createProxyClassAndInstance(enhancer, callbacks);
使用cglib代理时,调用方法时的处理须调用各个对应的内部MethodInterceptor实现类的intercept方法
private static class DynamicAdvisedInterceptor implements MethodInterceptor, Serializable { private final AdvisedSupport advised; public DynamicAdvisedInterceptor(AdvisedSupport advised) { this.advised = advised; } @Override @Nullable public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { //省略代码。。。。 //构建通知器链 List
使用jdk创建代理
public Object getProxy(@Nullable ClassLoader classLoader) { if (logger.isDebugEnabled()) { logger.debug("Creating JDK dynamic proxy: target source is " + this.advised.getTargetSource()); } Class>[] proxiedInterfaces = AopProxyUtils.completeProxiedInterfaces(this.advised, true); //查找Equals和HashCode这两个方法,并设置标志 findDefinedEqualsAndHashCodeMethods(proxiedInterfaces); return Proxy.newProxyInstance(classLoader, proxiedInterfaces, this); }
使用jdk代理,调用方法时的处理
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //省略代码。。。。 // Get the interception chain for this method. //通知器链 List
至此,aop增强过程就分析完了,如下图为整个调用过程:(看不清,可在右击新标签页查看)