Spring AOP原理(上)

SpringAOP工作原理-上 作为 Spring 体系里的大块头,AOP用起来是很爽,但是问你它是怎么实现的,你就懵逼。嘿嘿嘿 ~
还是从 SpringBoot 的启动流程来讲起,看看定义切面后的启动流程。
【Spring AOP原理(上)】先看我们的测试例子:
TestController.java :
Spring AOP原理(上)
文章图片

LogAspect.java :
Spring AOP原理(上)
文章图片

接下来,从启动流程看,TestController 和 LogAspect是怎么创建的。
我们找到 AbstractAutowireCapableBeanFactory#initializeBean() 方法,如图:

别问我怎么找到这个方法的,我不会告诉你是打了九九八十一个断点调出来的 =。=
Spring AOP原理(上)
文章图片

进入 applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName) 方法,看下参数:
Spring AOP原理(上)
文章图片

遍历到 AnnotationAwareAspectJAutoProxyCreator 这个processor的时候,debug进去,可以看到:
Spring AOP原理(上)
文章图片

这个 wrapIfNecessary()方法就很关键了,再点进去:
Spring AOP原理(上)
文章图片

可以看到这一步里,先是找到所有的通知器(拦截器或者增强器),然后接下来创建proxy:
点击createProxy(),进入,看核心代码代码:
protected Object createProxy(Class beanClass, @Nullable String beanName, @Nullable Object[] specificInterceptors, TargetSource targetSource) {……ProxyFactory proxyFactory = new ProxyFactory(); proxyFactory.copyFrom(this); ……Advisor[] advisors = buildAdvisors(beanName, specificInterceptors); proxyFactory.addAdvisors(advisors); proxyFactory.setTargetSource(targetSource); customizeProxyFactory(proxyFactory); proxyFactory.setFrozen(this.freezeProxy); if (advisorsPreFiltered()) { proxyFactory.setPreFiltered(true); }ClassLoader classLoader = getProxyClassLoader(); if (classLoader instanceof SmartClassLoader && classLoader != beanClass.getClassLoader()) { classLoader = ((SmartClassLoader) classLoader).getOriginalClassLoader(); } return proxyFactory.getProxy(classLoader); }

可以看到,这里都是对 proxyFactory 进行设置的。点击 proxyFactory.getProxy(classLoader) ,一直追到
DefaultAopProxyFactory # createAopProxy( ),这里就是创建代理的核心了:
public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException { // 如果开启了优化,或者 ProxyTargetClass设置为true,或者没有代理类要实现的接口 if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) { // 如果targetClass(这里是指我们调试的 TestController.class) 是接口或者代理类,则创建jdk动态代理,否则返回 cglib 代理 if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) { return new JdkDynamicAopProxy(config); } return new ObjenesisCglibAopProxy(config); } else { return new JdkDynamicAopProxy(config); } }

createAopProxy() 之后是 getProxy(),以 CglibAopProxy#getProxy() 为例:
public Object getProxy(@Nullable ClassLoader classLoader) {try { …… // 配置 CGLIB 增强器 Enhancer enhancer = createEnhancer(); if (classLoader != null) { enhancer.setClassLoader(classLoader); enhancer.setSuperclass(proxySuperClass); enhancer.setInterfaces(AopProxyUtils.completeProxiedInterfaces(this.advised)); enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE); enhancer.setStrategy(new ClassLoaderAwareGeneratorStrategy(classLoader)); // 获取代理的回调方法 Callback[] callbacks = getCallbacks(rootClass); Class[] types = new Class[callbacks.length]; for (int x = 0; x < types.length; x++) { types[x] = callbacks[x].getClass(); } enhancer.setCallbackFilter(new ProxyCallbackFilter( this.advised.getConfigurationOnlyCopy(), this.fixedInterceptorMap, this.fixedInterceptorOffset)); enhancer.setCallbackTypes(types); // 生成代理类和实例 return createProxyClassAndInstance(enhancer, callbacks); } }

大概流程就是这样了。总结一下,就是根据我们的目标类,生成jdk动态代理或者cglib代理,后面执行到这个目标类(例子中是TestController) 的时候,就用生成的代理类去执行,而代理类里面有增强器,也就是我们的横切面。
下一节讲cglib和jdk动态代理的工作流程。哈~

    推荐阅读