从前面的简单的分析之中,我们得知,在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,