springAop源码

什么是Aop

AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,利用AOP可以对业务逻辑进行增强,最常见的例子是我们可以在执行方法的前后打上日志,传统方式可能需要在每个方法前后进行硬编码,耦合度很高且不好维护,而AOP的出现正好可以解决这个问题。
AOP是一种思想,springAop和aspectJ都是AOP一种具体实现,官网图片
在这里插入图片描述

但由于springAop实现的语法对开发者不友好,所以借鉴了aspectJ的语法,提供springAOP的支持,注意并不是使用了aspectJ,只是借鉴语法

为什么能够对所有的方法做统一管理呢

spring利用了代理对象,生成代理对象的前后可以做一些特殊处理,所以最终把代理对象交给spring容器管理

AOP简单代码例子

@Configuration
@ComponentScan("com.aop")
// 开启AspectJ的语法对aop的支持
@EnableAspectJAutoProxy
public class AppConfig {
}

需要增强的方法

@Component
public class IndexDao {
    // 在这个方法前后进行增强,每个方法都是一个连接点
    public void query() {
        System.out.println("查询数据库");
    }
}

声明切面,对方法做增强

@Component
@Aspect // 表示是一个切面
public class TestAspect {

    // 切点 方法集合
    @Pointcut("execution(* com.aop.dao.*.*(..))")
    public void pointCut() {
    }

    // 通知
    @Before("pointCut()")
    public void doAccessCheck() {
        System.out.println("do before");
    }
}

测试类

public class Test {
    public static void main(String[] args) {
        // 是在这里就完成了动态代理,原因是在下面的getBean源码中找着找着就会找到这里的代码
        AnnotationConfigApplicationContext annotationConfigApplicationContext =
                new AnnotationConfigApplicationContext(AppConfig.class);
        // 由于这个类的输出和原本不同,是使用了代理对这个类做了改变
        // spring是使用了jdk cglib动态代理
        IndexDao bean = annotationConfigApplicationContext.getBean(IndexDao.class);
        bean.query();
    }
}

源码分析

首先看AopProxy 接口,可以看到动态代理有三种实现方式
在这里插入图片描述
接下来是找创建代理的过程
进入AbstractBeanFactory
在这里插入图片描述
点进去createBean 方法,可以看到
在这里插入图片描述
继续进去
在这里插入图片描述
继续进去
在这里插入图片描述
可以看到这里会有多个后置处理器,而真正处理代理的就是{AnnotationAwareAspectJAutoProxyCreator 这个处理,经过这个处理器后返回的就是代理对象了
在这里插入图片描述
所以接下来源码就直接去找这个AbstractAutoProxyCreator类的createProxy 方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最终就能找到是使用了哪个代理了
在这里插入图片描述
以上是简单的了解,更多细节需后续加强

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值