6-Spring-AOP原理(一)

EnableAspectJAutoProxy

使用AOP需要用到两个注解:

1.在配置类加上@EnableAspectJAutoProxy注解,开启基于注解的AOP模式

2.在切面类加上@Aspect注解,告诉Spring这是一个切面类

@EnableAspectJAutoProxy代码如下所示

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {
	boolean proxyTargetClass() default false;
	boolean exposeProxy() default false;
}

该注解使用@Import注解导入了AspectJAutoProxyRegistrar这个类

class AspectJAutoProxyRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(
            AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        // 查看这里面的代码可以发现
        // 它往ioc容器里面注入了 AnnotationAwareAspectJAutoProxyCreator 这个类
        AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);
        // 下面的暂时先不分析
        AnnotationAttributes enableAspectJAutoProxy =
                AnnotationConfigUtils.attributesFor(importingClassMetadata, EnableAspectJAutoProxy.class);
        if (enableAspectJAutoProxy != null) {
            if (enableAspectJAutoProxy.getBoolean("proxyTargetClass")) {
                AopConfigUtils.forceAutoProxyCreatorToUseClassProxying(registry);
            }
            if (enableAspectJAutoProxy.getBoolean("exposeProxy")) {
                AopConfigUtils.forceAutoProxyCreatorToExposeProxy(registry);
            }
        }
    }
}

AspectJAutoProxyRegistrar往ioc容器里面注入了AnnotationAwareAspectJAutoProxyCreator

AnnotationAwareAspectJAutoProxyCreator继承了很多父类,如下所示

AnnotationAwareAspectJAutoProxyCreator
	extends AspectJAwareAdvisorAutoProxyCreator
  	extends AbstractAdvisorAutoProxyCreator
  		extends AbstractAutoProxyCreator
  			extends ProxyProcessorSupport implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware
  
SmartInstantiationAwareBeanPostProcessor
  extends InstantiationAwareBeanPostProcessor
  	extends BeanPostProcessor

上面的一些接口定义如下

BeanFactoryAware

public interface BeanFactoryAware extends Aware {
    void setBeanFactory(BeanFactory var1) throws BeansException;
}

BeanPostProcessor

public interface BeanPostProcessor {
    @Nullable
    default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    @Nullable
    default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
}

InstantiationAwareBeanPostProcessor

public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {
    @Nullable
    default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        return null;
    }
    default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
        return true;
    }
    // 剩下的方法省略
    // ......
}

SmartInstantiationAwareBeanPostProcessor

public interface SmartInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessor {
  	// ......
}

AbstractAutoProxyCreator

public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport
        implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware {
    // 实现BeanFactoryAware的接口
    @Override
    public void setBeanFactory(BeanFactory beanFactory) {
        this.beanFactory = beanFactory;
    }

    // 实现 InstantiationAwareBeanPostProcessor 接口
    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) {
        // ......
    }
    @Override
    public boolean postProcessAfterInstantiation(Object bean, String beanName) {
        return true;
    }

    // 实现 BeanPostProcessor 接口
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) {
        return bean;
    }
    @Override
    public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) {
        // ......
    }
}

AbstractAdvisorAutoProxyCreator

public abstract class AbstractAdvisorAutoProxyCreator extends AbstractAutoProxyCreator {
    // 重写了父类AbstractAutoProxyCreator#setBeanFactory(BeanFactory beanFactory)
    @Override
    public void setBeanFactory(BeanFactory beanFactory) {
        super.setBeanFactory(beanFactory);
        if (!(beanFactory instanceof ConfigurableListableBeanFactory)) {
            throw new IllegalArgumentException(
                    "AdvisorAutoProxyCreator requires a ConfigurableListableBeanFactory: " + beanFactory);
        }
        initBeanFactory((ConfigurableListableBeanFactory) beanFactory);
    }
    protected void initBeanFactory(ConfigurableListableBeanFactory beanFactory) {
        this.advisorRetrievalHelper = new BeanFactoryAdvisorRetrievalHelperAdapter(beanFactory);
    }
}

AnnotationAwareAspectJAutoProxyCreator

public class AnnotationAwareAspectJAutoProxyCreator extends AspectJAwareAdvisorAutoProxyCreator {
    // 重写父类 AbstractAdvisorAutoProxyCreator#initBeanFactory(ConfigurableListableBeanFactory beanFactory)
    @Override
    protected void initBeanFactory(ConfigurableListableBeanFactory beanFactory) {
        super.initBeanFactory(beanFactory);
        if (this.aspectJAdvisorFactory == null) {
            this.aspectJAdvisorFactory = new ReflectiveAspectJAdvisorFactory(beanFactory);
        }
        this.aspectJAdvisorsBuilder =
                new BeanFactoryAspectJAdvisorsBuilderAdapter(beanFactory, this.aspectJAdvisorFactory);
    }
}

生成代理入口

前面分析Bean的实例化流程可以知道,Bean实例化的初始化操作会调用所有实现了BeanPostProcessor接口的postProcessAfterInitialization(Object bean, String beanName)方法,AOP就是在这个阶段来生成Bean的代理对象的,它根据扫描到的切面判断是否要为这个类生成代理对象。

下面来查看AbstractAutoProxyCreator#postProcessAfterInitialization方法

public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport
        implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware {
    public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) {
        if (bean != null) {
            // 获取对象名称
            Object cacheKey = getCacheKey(bean.getClass(), beanName);
            if (!this.earlyProxyReferences.contains(cacheKey)) {
                // 里面会判断是否需要生成代理对象
                return wrapIfNecessary(bean, beanName, cacheKey);
            }
        }
        return bean;
    }
    protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {
        // 省略......
        // 1. 为代理类找到增强方法
      	// 为这个 bean 获取advice方法,比如:@Aspect类里面的 @Before、@After
        Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);
        // specificInterceptors != DO_NOT_PROXY 说明这个bean存在代理方法
        if (specificInterceptors != DO_NOT_PROXY) {
          	// 保存这个bean被增强处理的状态
            this.advisedBeans.put(cacheKey, Boolean.TRUE);
            // 2. 产生代理对象
            // 内部可以通过 JDK 或者 CGLIB 生成代理对象。
            Object proxy = createProxy(
                    bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));
            this.proxyTypes.put(cacheKey, proxy.getClass());
            return proxy;
        }
        this.advisedBeans.put(cacheKey, Boolean.FALSE);
        return bean;
    }
}

1.为代理类找到增强方法

// AbstractAdvisorAutoProxyCreator.java
// 给某个类找到所有的Advisor, Advisor保存的就是那些切面方法
// 如果没有找到则返回 DO_NOT_PROXY, 代表这个类初始化的时候不需要产生代理;
@Override
@Nullable
protected Object[] getAdvicesAndAdvisorsForBean(
    Class<?> beanClass, String beanName, @Nullable TargetSource targetSource) {
    List<Advisor> advisors = findEligibleAdvisors(beanClass, beanName);
    if (advisors.isEmpty()) {
        return DO_NOT_PROXY;
    }
    return advisors.toArray();
}

// AbstractAdvisorAutoProxyCreator.java
// 给这个类找到合适的 Advisor
// 根据我们配置的正则式判断哪些类需要哪些切面
protected List<Advisor> findEligibleAdvisors(Class<?> beanClass, String beanName) {
    // 这里是获取所有的 Advisor
    List<Advisor> candidateAdvisors = findCandidateAdvisors();
    // 根据我们配置的正则式来获取Advisor
    List<Advisor> eligibleAdvisors = findAdvisorsThatCanApply(candidateAdvisors, beanClass, beanName);
    extendAdvisors(eligibleAdvisors);
    if (!eligibleAdvisors.isEmpty()) {
        eligibleAdvisors = sortAdvisors(eligibleAdvisors);
    }
    return eligibleAdvisors;
}

获取到合适的切面方法将会创建代理对象

2.产生代理对象

public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport
        implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware {
  
    protected Object createProxy(Class<?> beanClass, @Nullable String beanName,
                                 @Nullable Object[] specificInterceptors, TargetSource targetSource) {

        if (this.beanFactory instanceof ConfigurableListableBeanFactory) {
            AutoProxyUtils.exposeTargetClass((ConfigurableListableBeanFactory) this.beanFactory, beanName, beanClass);
        }
        // 创建代理工厂
        ProxyFactory proxyFactory = new ProxyFactory();
        proxyFactory.copyFrom(this);

        if (!proxyFactory.isProxyTargetClass()) {
            if (shouldProxyTargetClass(beanClass, beanName)) {
                proxyFactory.setProxyTargetClass(true);
            }
            else {
                evaluateProxyInterfaces(beanClass, proxyFactory);
            }
        }

        // 获取增强器方法
        Advisor[] advisors = buildAdvisors(beanName, specificInterceptors);
        // 将增强方法设置到代理工厂中
        proxyFactory.addAdvisors(advisors);
        proxyFactory.setTargetSource(targetSource);
        // 定制化代理工厂,这里可以忽略
        customizeProxyFactory(proxyFactory);

        proxyFactory.setFrozen(this.freezeProxy);
        if (advisorsPreFiltered()) {
            proxyFactory.setPreFiltered(true);
        }

        // 通过代理工厂帮我们创建代理对象
        return proxyFactory.getProxy(getProxyClassLoader());
    }
}

ProxyFactory

public class ProxyFactory extends ProxyCreatorSupport {
    public Object getProxy(@Nullable ClassLoader classLoader) {
        // createAopProxy() 是父类 ProxyCreatorSupport 的方法
      	// createAopProxy() 返回的是 AopProxy, 然后通过放回的是AopProxy.getProxy来生成代理对象
        return createAopProxy().getProxy(classLoader);
    }
}


public class ProxyCreatorSupport extends AdvisedSupport {
    protected final synchronized AopProxy createAopProxy() {
        if (!this.active) {
            activate();
        }
        // getAopProxyFactory() 返回的是 AopProxyFactory, 默认类为DefaultAopProxyFactory
      	// 
        return getAopProxyFactory().createAopProxy(this);
    }
}

public class DefaultAopProxyFactory implements AopProxyFactory, Serializable {
  	// 获取AOP的代理, JDK或者CGLIB 
    @Override
    public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
        if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
            Class<?> targetClass = config.getTargetClass();
            if (targetClass == null) {
                throw new AopConfigException("TargetSource cannot determine target class: " +
                        "Either an interface or a target is required for proxy creation.");
            }
            if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
                return new JdkDynamicAopProxy(config);
            }
            return new ObjenesisCglibAopProxy(config);
        }
        else {
            return new JdkDynamicAopProxy(config);
        }
    }
}

版权声明:本文为lizc_lizc原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。