//所以下面也要进行区分开来
//个人总感觉这种设置不太好。。。。。。
//判断是不是引介增强
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的信息
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);
}
}
//将增强器集合对象转化成一个数组