spring-aop源码解析之代理bean的创建以及使用

从前面的简单的分析之中,我们得知,在ioc创建好我们的切入点的bean之后,使用的并不是创建好的bean,而还会为他创建一个代理bean。这个代理bean中有其关于方法增强的属性。具体的代理bean的属性如下图所示。
在这里插入图片描述
可以清楚看到创建的代理对象中有相关的增强器。
再来看看增强器都有什么属性
在这里插入图片描述
增强器的类型 以及属于哪个切面类, 增强器在哪个方法上作用都有相关字段记录。

对于cglib代理来说。他会设置多个callback,同时就必须得有一个callbackFilter来告诉我们代理对象执行方法的时候,用哪一个callback。

在spring-aop中,他为我们设置了7个callback,而执行哪个callback在创建代理对象的时候的filter里面指定了规则。

具体代码在这一块

CglibAopProxy   135  line
//在创建代理对象之前,创建好callback,并且设置好callback的执行规则(也就是callbackFilter)
enhancer.setCallbackFilter(new CglibAopProxy.ProxyCallbackFilter(this.advised.getConfigurationOnlyCopy(), this.fixedInterceptorMap, this.fixedInterceptorOffset));
//设置callback类型 (数组)
enhancer.setCallbackTypes(types);
return this.createProxyClassAndInstance(enhancer, callbacks);

具体的cglib如何创建代理对象以及使用 看我最后的demo就ok
在这里插入图片描述
至于每个callback的作用我们就不做分析了。重点是我们的目标方法执行的话,会触动第一个callback的执行。

所以我来来看看代理对象的创建,以及代理对象的使用

代理对象的创建

AbstractAutoProxyCreator   174  line

protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {
   
        if (StringUtils.hasLength(beanName) && this.targetSourcedBeans.contains(beanName)) {
   
            return bean;
        } else if (Boolean.FALSE.equals(this.advisedBeans.get(cacheKey))) {
   
            return bean;
            //bean是否有相关切面的注解  没有才会进入到这里
        } else if (!this.isInfrastructureClass(bean.getClass()) && !this.shouldSkip(bean.getClass(), beanName)) {
   
        	//获取方法增强器 
        	//1、获取所有的增强器
        	//2、获取正处理的类的所有方法
        	//3、遍历,判断有没有方法与增强器匹配,有的话,则收集起来,返回。没有,返回DO_NOT_PROXY
            Object[] specificInterceptors = this.getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值