Spring(十八):AOP——寻找匹配的增强器

//所以下面也要进行区分开来

//个人总感觉这种设置不太好。。。。。。

//判断是不是引介增强

if (advisor instanceof IntroductionAdvisor) {

//如果是引介增强,进行匹配

return ((IntroductionAdvisor) advisor).getClassFilter().matches(targetClass);

}

//判断是不是普通增强

else if (advisor instanceof PointcutAdvisor) {

PointcutAdvisor pca = (PointcutAdvisor) advisor;

//再次适用重载的canApply去进行匹配

return canApply(pca.getPointcut(), targetClass, hasIntroductions);

}

else {

// It doesn’t have a pointcut so we assume it applies.

return true;

}

}

Emmmmm,后面的匹配过程太复杂了,没看懂。。。。。。

现在我们已经获取到了所有增强器了,下面就要开始创建切面了

返回到上面的AbstractAutoProxyCreator的wrapIfNecessary方法里面

在这里插入图片描述

现在我们已经完成了getAdvicesAndAdvisorsForBean方法,获取到了所有匹配的增强器,下面就是要给该Bean去创建代理对象了,注意这里不要搞混了,之前我们找代理对象是通过遍历容器里面的所有Bean去找到的,如今当前的Bean是准备被代理的Bean,此时ProxyFactory已经有了所有增强器和此时被代理的Bean的信息

AOP——创建切面


createProxy方法

该方法的源码如下

protected Object createProxy(Class<?> beanClass, @Nullable String beanName,

@Nullable Object[] specificInterceptors, TargetSource targetSource) {

//要注意,此时的bean是从IOC容器里面加载出来的Bean,已经是一个Object了

//这个bean代表的就是切面类的在IOC容器存储的Bean

//这里传进来的是这个bean的Class对象

if (this.beanFactory instanceof ConfigurableListableBeanFactory) {

AutoProxyUtils.exposeTargetClass((ConfigurableListableBeanFactory) this.beanFactory, beanName, beanClass);

}

//新创建一个ProxyFactory对象

ProxyFactory proxyFactory = new ProxyFactory();

//从当前的类中去获取拷贝一些相关属性

proxyFactory.copyFrom(this);

//判断给定的bean是否应该使用targetClass

//如果targetClass是Proxy.class

if (proxyFactory.isProxyTargetClass()) {

//如果使用的是targetClass

//证明使用的不是它的接口来进行代理

// Explicit handling of JDK proxy targets (for introduction advice scenarios)

//判断当前的传进来的beanClass是不是Proxy.class

//如果是proxy.class那就要将里面的接口添加进来

//Proxy.class是JDK自带的代理类,所以支持JDK代理

if (Proxy.isProxyClass(beanClass)) {

// Must allow for introductions; can’t just set interfaces to the proxy’s interfaces only.

///遍历beanClass里面的接口,并且添加进切面工厂里面

//这里是将代理接口放进去工厂里面

for (Class<?> ifc : beanClass.getInterfaces()) {

proxyFactory.addInterface(ifc);

}

}

}

else {

// No proxyTargetClass flag enforced, let’s apply our default checks…

if (shouldProxyTargetClass(beanClass, beanName)) {

proxyFactory.setProxyTargetClass(true);

}

else {

//这里同样是将代理接口代理工厂里面

evaluateProxyInterfaces(beanClass, proxyFactory);

}

}

//将增强器集合对象转化成一个数组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值