Spring AOP源码解析
2021-11-20 19:51
597 查看
AOP源码分析
gradle引入aop的依赖:
group 'org.springframework' version '5.1.21.BUILD-SNAPSHOT' apply plugin: 'java' sourceCompatibility = 1.8 repositories { mavenCentral() } dependencies { compile(project(":spring-context")) compile group:'org.aspectj',name:'aspectjweaver',version: '1.8.6' testCompile group: 'junit', name: 'junit', version: '4.12' }
我们知道AOP的实现是使用的动态代理的方式,那必然是在创建对象的时候创建了一个代理对象。
那么代理类是什么时候创建的呢?实际上代理类的创建是通过BeanPostProcessor的后置处理来做的。
经过之前IOC源码的学习,我们可以知道,后置处理器的代码的位置。
@Override public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException { Object result = existingBean; for (BeanPostProcessor processor : getBeanPostProcessors()) { Object current = processor.postProcessAfterInitialization(result, beanName); if (current == null) { return result; } result = current; } return result; }
它会遍历所有实现了BeanPostProcessor的Bean,其中有一个AspectJAwareAdvisorAutoProxyCreator,看名字就知道跟AOP是相关的。既然它实现了BeanPostProcessor接口,我们就要去找它的postProcessAfterInitialization 方法。
当前类没有,就往父类里面找,在AbstractAutoProxyCreator里面找到
public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) { if (bean != null) { Object cacheKey = getCacheKey(bean.getClass(), beanName); if (this.earlyProxyReferences.remove(cacheKey) != bean) { return wrapIfNecessary(bean, beanName, cacheKey); } } return bean; }
跟踪wrapIfNecessary方法进入
protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) { if (StringUtils.hasLength(beanName) && this.targetSourcedBeans.contains(beanName)) { return bean; } 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; } // 如果有设置增强的话,就创建代理对象 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; }
可以看出如果有设置aop相关增强的话,就会去调用createProxy方法,创建并返回代理对象。
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()); }
我们点proxyFactory.getProxy这个方法,发现他有两个实现。
接下来就会根据这两个不同的实现创建出代理对象,对原方法进行增强。
相关文章推荐
- Spring AOP源码解析:二:代理对象的创建
- Spring基于注解形式的 AOP的原理流程及源码解析(四)
- 曹工说Spring Boot源码(16)-- Spring从xml文件里到底得到了什么(aop:config完整解析【上】)
- Spring核心框架 - AOP的原理及源码解析
- Spring AOP 源码解析:注解式切面增强机制
- SpringAOP源码解析之代理创建篇
- Spring AOP源码解析:三:代理对象的执行,各种Advice的执行流程
- Spring AOP功能源码解析
- SpringAOP源码解析之执行篇
- Spring源码分析:AOP源码解析(上篇)
- SpringBoot源码解析:AOP思想以及相应的应用
- Spring源码分析:AOP源码解析(上篇)
- 曹工说Spring Boot源码(18)-- Spring AOP源码分析三部曲,终于快讲完了 (aop:config完整解析【下】)
- spring 源码探索 -- aop 标签解析和创建代理
- Spring源码解析(三):Spring的AOP实现
- Spring5.0源码深度解析之SpringBean的Aop的使用
- Spring源码分析:AOP源码解析(下篇)
- 曹工说Spring Boot源码(17)-- Spring从xml文件里到底得到了什么(aop:config完整解析【中】)
- spring源码解析-AOP原理
- (八)Spring核心框架 - AOP的原理及源码解析