• SpringAop原码解析


    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植入方法待分析。

  • 相关阅读:
    HTML 与 CSS 有什么区别?
    用Stable Diffusion生成同角色不同pose的人脸
    Vue安装过程的困惑解答——nodejs和vue关系、webpack、vue-cli、vue的项目结构
    设计模式- 适配器模式(Adapter Pattern)结构|原理|优缺点|场景|示例
    如果员工因为管理者而辞职,为什么不解雇管理者呢?
    Linux下网络编程
    WEB服务器的超级防护——安全WAF
    shiro的会话管理器SessionManager
    【docker】拉取人大金仓KingbaseES数据库镜像速度很慢问题
    【注释和反射】类加载的过程
  • 原文地址:https://blog.csdn.net/heikeb/article/details/126582524