@EnableAspectJAutoProxy点进去,有两个Boolean类型变量:
一个:Boolean类型的proxyTargetClass 变量,true-cglib,false-java自带。默认false。
第二个Boolean类型变量:exposeProxy,控制代理的暴露方式,解决内部调用不能使用代理的场景,默认为false.
下面要用。
重点是:AspectJAutoProxyRegistrar.class,点进去
AspectJAutoProxyRegistrar
public void registerBeanDefinitions(
AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
// 核心是下面这句:将把AnnotationAwareAspectJAutoProxyCreator这个类定义为BeanDefinition放到spring容器中
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);
}
}
}
点进去:AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);
AopConfigUtils
public static BeanDefinition registerAspectJAnnotationAutoProxyCreatorIfNecessary(
BeanDefinitionRegistry registry, @Nullable Object source) {
// registerOrEscalateApcAsRequired 这个方法是做bean放到spring容器中,我们重点看一下
//AnnotationAwareAspectJAutoProxyCreator 这个类
return registerOrEscalateApcAsRequired(AnnotationAwareAspectJAutoProxyCreator.class, registry, source);
}
AnnotationAwareAspectJAutoProxyCreator
看一些类层次图
先看一下:AbstractAutoProxyCreator这个抽象类。这个方法postProcessBeforeInstantiation
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) {
Object cacheKey = getCacheKey(beanClass, beanName);
// 做校验,是否需要对bean进行代理(特殊的类,和已经被代理),
if (!StringUtils.hasLength(beanName) || !this.targetSourcedBeans.contains(beanName)) {
if (this.advisedBeans.containsKey(cacheKey)) {
return null;
}
if (isInfrastructureClass(beanClass) || shouldSkip(beanClass, beanName)) {
this.advisedBeans.put(cacheKey, Boolean.FALSE);
return null;
}
}
// 一般不指定,所以:targetSource是null,这不是关键代码
TargetSource targetSource = getCustomTargetSource(beanClass, beanName);
if (targetSource != null) {
}
return null;
}
postProcessAfterInitializatio
// 这个类,主要做,如果这个bean别标记为代理,就使用配置的拦截器生成一个代理
public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) {
if (bean != null) {
Object cacheKey = getCacheKey(bean.getClass(), beanName);
if (this.earlyProxyReferences.remove(cacheKey) != bean) {
// 这是关键代码
return wrapIfNecessary(bean, beanName, cacheKey);
}
}
return bean;
}
点进去
protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {
// 省略一些代码
// Create proxy if we have advice.
// 这步是关键,获取到配置的所有增强方法
Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);
if (specificInterceptors != DO_NOT_PROXY) {
this.advisedBeans.put(cacheKey, Boolean.TRUE);
// 创建代理了,我们口中常说的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;
}
如图
return proxyFactory.getProxy(getProxyClassLoader()); -> 从代理工厂拿到代理,ProxyFactory#getProxy方法 return createAopProxy().getProxy(classLoader); ->createAopProxy点进去,发现到了是 ProxyCreatorSupport类–>return getAopProxyFactory().createAopProxy(this);–>找其实现(只有一个实现类 DefaultAopProxyFactory)
如下
public class DefaultAopProxyFactory implements AopProxyFactory, Serializable {
@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)) {
// 创建 jdk代理
return new JdkDynamicAopProxy(config);
}
// 创建 cglib代理
return new ObjenesisCglibAopProxy(config);
}
else {
return new JdkDynamicAopProxy(config);
}
}
简单分析了Spring动态代理类的生成流程。
简单总结
@EnableAspectJAutoProxy;
AspectJAutoProxyRegistrar:注册AnnotationAwareAspectJAutoProxyCreator
AnnotationAwareAspectJAutoProxyCreator:AOP动态代理自动生成的处理类,其他类似的类有AspectJAwareAdvisorAutoProxyCreator和InfrastructureAdvisorAutoProxyCreator等;
AopConfigUtils:AOP配置工具类
ProxyFactory:代理工厂
AopProxy接口:常见实现类ObjenesisCglibAopProxy、JdkDynamicAopProxy