1.开启SpringAop组件支持

这里引入

@Import注解的作用是由ConfigClassPostProcessor这个beanFactoryPostProcessor在容器启动后bean加载后初始化之前处理,这里是把AspectJAutoProxyRegistrar的registerBeanDefinitions这个方法进行回调,用AopConfigUtils

这个方法AopUtile最后调到这里:


上面这几个方法,实现把AnnotationAwareAspectJAutoProxyCreator这个beanPostProcessor装载进容器里

最终在这里wrapIfNecessary()创建bean代理的
这两个方法在spring的bean的创建流程在doCreateBean和Bean初始化阶段回调BeanPostProcessor


这里Object[] specificInterceptors是查找@Aspect注解Aop配置类,解析@Pointcut切点信息 @Before @After @Around等信息
类似下面这个

之后调用createProxy方法


proxyFactory.isProxyTargetClass()为tru表示使用基于cglib的之类代理,如果不是则evaluateProxyInterfaces查找目标类实现的所有接口放到proxyfactory里。这些接口后面要做jdk动态代理。
之后调用代理工厂proxyFactory生成代理。 这里有两个工厂模式外面的是proxyFactory, 在proxyFactory.getProxy(getProxyClassLoader())这个方法里面,createAopProxy()又创建另外一个AopProxy工厂,AopProxy是直接用来创建代理对象的,AopProxy不同的代理机制有不同的实现类,具体实现类是通过AopProxy工厂创建的。AopProxy工厂系统默认用DefaultAopProxyFactory。


getAopProxyFactory()返回的是DefaultAopProxyFactory这个构造函数时创建的aopProxFactory工厂
下面主要看DefaultAopProxyFactory是怎么创建AopProxy的
if里的这三个判断isOptimize默认为false,isProxyTargetClass默认为false(可以在@EnableAspectJAutoProxy指定为true), hasNoUserSupliedProxyInerfasece如果目标对象存在接口返回false 不存在接口返回true。
这三个如果目标对象存在接口,那么是false的 所有是不会进入new ObjenesisCglibAopProxy(config)方法也不会创建cglib动态代理; 从这里看出只要目标对象存在接口Spring默认走得事jdk动态代理; 当然也可以isProxyTargetClass为true,那么不管目标对象是否实现了接口都会走cglib。jdk动态代理 只能代理目标对象的接口方法。cglib所有public方法都可以。

这里返回了 JdkDynamicAopProxy这个AopProxy对象

this.advised其实是外面的那个DefaultAopProxyFactory,通过他获取目标对象的所有的接口proxiedInterfaces,接下来通过Proxy.newProxyInstrance实现对目标对象的代理。

注意这个方法传的this其实就是JdkDymanicAopProxy对象本身,JdkDymanicAopProxy实现了InvocationHandler接口,也持有目标对象this.advised.targetSource。

这个invoke方法主要实现对@before @After @Around等切面方法的植入目标对象方法中。invoke植入方法待分析。