AOP-AspectJ注解源码解析
2022-12-15 本文已影响0人
王侦
1.示例
public class Main {
public static void main(String[] args) {
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("spring-aop-test.xml");
TestInterface test = (TestInterface) applicationContext.getBean("test");
test.dosomeTest();
System.out.println("-----");
test.doOtherTest();
System.out.println("-----");
test.a();
test.b();
}
}
@Aspect
public class AspectConfig {
/**
* 如何定义一个切点?
* 切点位置:com.xl.code 包下的所有class 的所有 test结尾的方法。
*/
@Pointcut(value = "execution(* com.wz.spring..*.*Test(..))")
public void test(){}
/**
* 定义一个前置通知
*/
@Before(value = "test()")
public void beforeAdvice() {
System.out.println("before advice");
}
/**
* 定义一个后置通知
*/
@After(value = "test()")
public void afterAdvice() {
System.out.println("after advice");
}
/**
* 定义一个环绕通知
*/
@Around(value = "execution(* com.wz.spring..*.*Test(..))")
public void aroundAdvice(ProceedingJoinPoint joinPoint) {
try {
System.out.println("around advice begin");
joinPoint.proceed();
System.out.println("around advice end");
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}
public class TestImpl implements TestInterface {
@Override
public void dosomeTest() {
System.out.println("dosomeTest execute");
}
@Override
public void doOtherTest() {
System.out.println("doOtherTest execute");
}
@Override
public void a() {
System.out.println("a function execute");
}
@Override
public void b() {
System.out.println("b function execute");
}
}
配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<aop:aspectj-autoproxy />
<bean class="com.wz.spring.aop.demo05.AspectConfig"/>
<bean name="test" class="com.wz.spring.aop.demo05.TestImpl"/>
</beans>
输出结果:
around advice begin
before advice
dosomeTest execute
after advice
around advice end
-----
around advice begin
before advice
doOtherTest execute
after advice
around advice end
-----
a function execute
b function execute
2.<aop:aspectj-autoproxy />
AopNamespaceHandler
public void init() {
// In 2.0 XSD as well as in 2.5+ XSDs
registerBeanDefinitionParser("config", new ConfigBeanDefinitionParser());
registerBeanDefinitionParser("aspectj-autoproxy", new AspectJAutoProxyBeanDefinitionParser());
registerBeanDefinitionDecorator("scoped-proxy", new ScopedProxyBeanDefinitionDecorator());
// Only in 2.0 XSD: moved to context namespace in 2.5+
registerBeanDefinitionParser("spring-configured", new SpringConfiguredBeanDefinitionParser());
}
class AspectJAutoProxyBeanDefinitionParser implements BeanDefinitionParser {
/**
* @param element 包装 <aop:aspectj-autoproxy /> 标签数据。
* @param parserContext 它持有一个 readerContext ,readerContext 它又持有 registry 也就是咱们的 BeanFactory
*/
@Override
@Nullable
public BeanDefinition parse(Element element, ParserContext parserContext) {
AopNamespaceUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(parserContext, element);
extendBeanDefinition(element, parserContext);
return null;
}
2.1 AopNamespaceUtils#registerAspectJAnnotationAutoProxyCreatorIfNecessary
public static void registerAspectJAnnotationAutoProxyCreatorIfNecessary(
ParserContext parserContext, Element sourceElement) {
BeanDefinition beanDefinition = AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(
parserContext.getRegistry(), parserContext.extractSource(sourceElement));
useClassProxyingIfNecessary(parserContext.getRegistry(), sourceElement);
registerComponentIfNecessary(beanDefinition, parserContext);
}
public static BeanDefinition registerAspectJAnnotationAutoProxyCreatorIfNecessary(
BeanDefinitionRegistry registry, @Nullable Object source) {
return registerOrEscalateApcAsRequired(AnnotationAwareAspectJAutoProxyCreator.class, registry, source);
}
//参数一:固定类型 AnnotationAwareAspectJAutoProxyCreator 很关键的class,
// 咱们的Aop功能 全靠这个class了
//参数二:Spring容器
//参数三:element
@Nullable
private static BeanDefinition registerOrEscalateApcAsRequired(
Class<?> cls, BeanDefinitionRegistry registry, @Nullable Object source) {
Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
//判断容器内是否有 名称 是AUTO_PROXY_CREATOR_BEAN_NAME BD
// 一般不会走这里,走这里主要原因是 自定义 注解解析器了
if (registry.containsBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME)) {
BeanDefinition apcDefinition = registry.getBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME);
if (!cls.getName().equals(apcDefinition.getBeanClassName())) {
int currentPriority = findPriorityForClass(apcDefinition.getBeanClassName());
int requiredPriority = findPriorityForClass(cls);
if (currentPriority < requiredPriority) {
apcDefinition.setBeanClassName(cls.getName());
}
}
return null;
}
//创建了一个BD,并且设置class 是 AnnotationAwareAspectJAutoProxyCreator
// 最后将这个bd 注册到 容器中了
RootBeanDefinition beanDefinition = new RootBeanDefinition(cls);
beanDefinition.setSource(source);
beanDefinition.getPropertyValues().add("order", Ordered.HIGHEST_PRECEDENCE);
beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
registry.registerBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME, beanDefinition);
return beanDefinition;
}
再来看看AopNamespaceUtils#useClassProxyingIfNecessary
// 参数一:Spring容器
// 参数二:aop标签
private static void useClassProxyingIfNecessary(BeanDefinitionRegistry registry, @Nullable Element sourceElement) {
if (sourceElement != null) {
// proxy-target-class 标签属性:true 表示 AOP 底层实现
// 采用 cglib,默认这个属性是false
boolean proxyTargetClass = Boolean.parseBoolean(sourceElement.getAttribute(PROXY_TARGET_CLASS_ATTRIBUTE));
if (proxyTargetClass) {
//配置了 proxy-target-class 并且值是 true
//获取出来AOP相关的这个BD,向这个BD里面添加一个属性 proxyTargetClass=true
AopConfigUtils.forceAutoProxyCreatorToUseClassProxying(registry);
}
//expose-proxy 作用就是 将 当前代理对象 暴露到 上下文内,
// 方便代理对象内部的真实对象 拿到 代理对象。
boolean exposeProxy = Boolean.parseBoolean(sourceElement.getAttribute(EXPOSE_PROXY_ATTRIBUTE));
if (exposeProxy) {
//获取出来AOP相关的这个BD,向这个BD里面添加一个属性 exposeProxy = true
AopConfigUtils.forceAutoProxyCreatorToExposeProxy(registry);
}
}
}
3.AnnotationAwareAspectJAutoProxyCreator
3.1 AbstractAutoProxyCreator作为InstantiationAwareBeanPostProcessor
这是个短路操作
@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) {
Object cacheKey = getCacheKey(beanClass, beanName);
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;
}
}
// Create proxy here if we have a custom TargetSource.
// Suppresses unnecessary default instantiation of the target bean:
// The TargetSource will handle target instances in a custom fashion.
TargetSource targetSource = getCustomTargetSource(beanClass, beanName);
if (targetSource != null) {
if (StringUtils.hasLength(beanName)) {
this.targetSourcedBeans.add(beanName);
}
Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(beanClass, beanName, targetSource);
Object proxy = createProxy(beanClass, beanName, specificInterceptors, targetSource);
this.proxyTypes.put(cacheKey, proxy.getClass());
return proxy;
}
return null;
}
在 AbstractAutowireCapableBeanFactory#createBean()中doCreateBean()创建实例之前:
try {
// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
//可以通过后处理器,在这一步返回一个代理实例对象..注意,这里的代理对象不是Spring AOP 逻辑实现的地方。
//instantiation 实例化不要和init 搞混。
//后处理器调用点:创建实例之前的一个调用点。
// 它的另外一个作用就是对AOP提供了支持,在这里会将一些不需要被代理的Bean进行标记
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
//条件成立会形成一个短路操作,这里直接返回了.
if (bean != null) {
return bean;
}
}
3.2 AbstractAutoProxyCreator作为BeanPostProcessor
这个调用位置是在初始化实例后调用的:
protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
if (System.getSecurityManager() != null) {
AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
invokeAwareMethods(beanName, bean);
return null;
}, getAccessControlContext());
}
else {
invokeAwareMethods(beanName, bean);
}
Object wrappedBean = bean;
if (mbd == null || !mbd.isSynthetic()) {
//后处理器调用点:BeforeInitialization 初始化之前的后处理器调用点
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
}
try {
invokeInitMethods(beanName, wrappedBean, mbd);
}
catch (Throwable ex) {
throw new BeanCreationException(
(mbd != null ? mbd.getResourceDescription() : null),
beanName, "Invocation of init method failed", ex);
}
if (mbd == null || !mbd.isSynthetic()) {
//后处理器调用点:AfterInitialization 初始化之后的后处理器的调用点
//典型应用:Spring AOP的实现
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
return wrappedBean;
}
来看看其实现的方法:
/**
* @param bean Spring容器完全初始化完毕的实例对象
* @param beanName
* Create a proxy with the configured interceptors if the bean is
* identified as one to proxy by the subclass.
* @see #getAdvicesAndAdvisorsForBean
*/
@Override
public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) {
if (bean != null) {
//cacheKey 大部分情况下 都是 beanName
Object cacheKey = getCacheKey(bean.getClass(), beanName);
//防止重复代理某个bean实例。这里A B循环依赖,且需要AOP代理,
// 则B处理属性A时,已经将A的原始对象放入到了earlyProxyReferences,并且生成了A的AOP代理对象,所以不需要重复生成。
if (this.earlyProxyReferences.remove(cacheKey) != bean) {
// AOP操作入口
return wrapIfNecessary(bean, beanName, cacheKey);
}
}
return bean;
}
earlyProxyReferences,这里A B循环依赖,且需要AOP代理,则B处理属性A时,已经将A的原始对象放入到了earlyProxyReferences,并且生成了A的AOP代理对象,所以不需要重复生成。
3.2.1 earlyProxyReferences作用分析(AbstractAutoProxyCreator作为SmartInstantiationAwareBeanPostProcessor)
/**
* 为了避免重复将某个bean生成代理对象...
* 1.普通路径
* 2.bean 与 bean 之间形成依赖时,也会提前创建代理对象。
*/
private final Map<Object, Object> earlyProxyReferences = new ConcurrentHashMap<>(16);
循环依赖:
- 一级缓存,singletonObjects,存储所有已创建完毕的单例 Bean (完整的 Bean)
- 二级缓存,earlySingletonObjects,存储所有仅完成实例化,但还未进行属性注入和初始化的 Bean
- 三级缓存,singletonFactories,存储能建立这个 Bean 的一个工厂ObjectFactory,通过工厂ObjectFactory#getObject能获取这个 Bean,延迟化 Bean 的生成,工厂生成的 Bean 会塞入二级缓存
getBean()步骤:
- getSingleton(beanName) 依次从三个缓存中获取
- 实例化
- addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
- 属性注入
- 初始化
一个大致过程: getBean(A),AB循环依赖
- A执行属性注入,这个时候 A 发现需要注入 B,所以去 getBean(B),此时又会走一遍上面描述的逻辑。
- 到了 B 的属性注入这一步,此时 B 调用 getBean(A),这时候一级缓存里面找不到,但是发现 A 正在创建中的,于是去二级缓存找,发现没找到,于是去三级缓存找,然后找到了。
并且通过上面提前在三级缓存里暴露的工厂得到 A,然后将这个工厂从三级缓存里删除,并将 A 加入到二级缓存中。(这里getBean()就返回了,不会走后面创建Bean的生命周期过程。)
然后结果就是 B 属性注入成功。(这里如果是AOP循环依赖,会返回代理对象。)
紧接着 B 调用 initializeBean 初始化,最终返回,此时 B 已经被加到了一级缓存里 。 - 这时候就回到了 A 的属性注入,此时注入了 B,接着执行初始化,最后 A 也会被加到一级缓存里,且从二级缓存中删除 A。
ObjectFactory实际是:
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
AbstractAutowireCapableBeanFactory#getEarlyBeanReference
protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
Object exposedObject = bean;
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp;
exposedObject = ibp.getEarlyBeanReference(exposedObject, beanName);
}
}
}
return exposedObject;
}
AbstractAutoProxyCreator#getEarlyBeanReference
@Override
public Object getEarlyBeanReference(Object bean, String beanName) {
Object cacheKey = getCacheKey(bean.getClass(), beanName);
// 这里放入的是原始的beanName对应的原始的bean
this.earlyProxyReferences.put(cacheKey, bean);
// 这里返回的是bean的代理对象
return wrapIfNecessary(bean, beanName, cacheKey);
}
3.3 AbstractAutowireCapableBeanFactory#doCreateBean对于返回Bean的处理
protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
throws BeanCreationException {
// Instantiate the bean.
//包装对象,内部最核心的字段就是咱们的真实实例。它提供了一些额外的接口方法,比如 属性访问器
BeanWrapper instanceWrapper = null;
if (mbd.isSingleton()) {
// FactoryBean#getObject()匹配,避免重复创建,直接从这里获取
instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
}
if (instanceWrapper == null) {
//该方法创建出来真实的bean实例,并且将其包装到BeanWrapper实例中。
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
Object bean = instanceWrapper.getWrappedInstance();
Class<?> beanType = instanceWrapper.getWrappedClass();
if (beanType != NullBean.class) {
mbd.resolvedTargetType = beanType;
}
// Allow post-processors to modify the merged bean definition.
synchronized (mbd.postProcessingLock) {
if (!mbd.postProcessed) {
try {
//后处理器调用点:合并bd信息,因为接下来就是populate处理依赖了..
applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
}
catch (Throwable ex) {
throw new BeanCreationException(mbd.getResourceDescription(), beanName,
"Post-processing of merged bean definition failed", ex);
}
mbd.postProcessed = true;
}
}
// Eagerly cache singletons to be able to resolve circular references
// even when triggered by lifecycle interfaces like BeanFactoryAware.
boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
isSingletonCurrentlyInCreation(beanName));
if (earlySingletonExposure) {
if (logger.isTraceEnabled()) {
logger.trace("Eagerly caching bean '" + beanName +
"' to allow for resolving potential circular references");
}
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
}
// Initialize the bean instance.
Object exposedObject = bean;
try {
//处理当前实例的依赖数据...依赖注入在这一步完成的。
populateBean(beanName, mbd, instanceWrapper);
//生命周期中的初始化方法的调用。
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
catch (Throwable ex) {
if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {
throw (BeanCreationException) ex;
}
else {
throw new BeanCreationException(
mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);
}
}
if (earlySingletonExposure) {
Object earlySingletonReference = getSingleton(beanName, false);
//条件成立:说明当前bean实例 从 2级缓存获取到了...
//说明产生循环依赖了...3级缓存 当前对象的ObjectFactory.getObject() 被调用过
if (earlySingletonReference != null) {
//条件成立有几种情况?
//1.当前“真实实例”不需要被代理
//2.当前“实例”已经被代理过了...是在ObjectFactory.getObject() 方法调用时 实现的增强代理。
if (exposedObject == bean) {
exposedObject = earlySingletonReference;
}
else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
//获取依赖当前bean的 其它beanName
String[] dependentBeans = getDependentBeans(beanName);
Set<String> actualDependentBeans = new LinkedHashSet<>(dependentBeans.length);
for (String dependentBean : dependentBeans) {
if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
actualDependentBeans.add(dependentBean);
}
}
//为什么有问题?
//因为咱们当前对象的AOP操作是在 当前方法的 initializeBean 这个方法完成的。
//在这之前 外部其它bean持有到的当前的 “bean实例” 都是尚未增强的。
if (!actualDependentBeans.isEmpty()) {
throw new BeanCurrentlyInCreationException(beanName,
"Bean with name '" + beanName + "' has been injected into other beans [" +
StringUtils.collectionToCommaDelimitedString(actualDependentBeans) +
"] in its raw version as part of a circular reference, but has eventually been " +
"wrapped. This means that said other beans do not use the final version of the " +
"bean. This is often the result of over-eager type matching - consider using " +
"'getBeanNamesForType' with the 'allowEagerInit' flag turned off, for example.");
}
}
}
}
// Register bean as disposable.
try {
//判断当前bean实例是否需要注册 析构回调。当容器销毁时,会给当前bean的析构方法进行回调。
registerDisposableBeanIfNecessary(beanName, bean, mbd);
}
catch (BeanDefinitionValidationException ex) {
throw new BeanCreationException(
mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
}
return exposedObject;
}
getBean(A),AB循环依赖
- A执行属性注入,这个时候 A 发现需要注入 B,所以去 getBean(B),此时又会走一遍上面描述的逻辑。
- 到了 B 的属性注入这一步,此时 B 调用 getBean(A),这时候一级缓存里面找不到,但是发现 A 正在创建中的,于是去二级缓存找,发现没找到,于是去三级缓存找,然后找到了。
并且通过上面提前在三级缓存里暴露的工厂得到 A,然后将这个工厂从三级缓存里删除,并将 A 加入到二级缓存中。(这里getBean()就返回了,不会走后面创建Bean的生命周期过程。)
然后结果就是 B 属性注入成功。(这里如果是AOP循环依赖,会返回代理对象。)
紧接着 B 调用 initializeBean 初始化,最终返回,此时 B 已经被加到了一级缓存里 。 - 这时候就回到了 A 的属性注入,此时注入了 B,接着执行初始化,最后 A 也会被加到一级缓存里,且从二级缓存中删除 A。
这里特别关注一下doCreateBean()最后(产生循环依赖时,earlySingletonReference 不为null)返回的Bean到底是啥?
- 1)A和B没有进行AOP代理,所以exposedObject与bean都是原生的Bean,二级缓存里面也是直接返回该原生Bean就行
- 2)A和B进行了AOP代理,但是A -> getBean(B) -> getBean(A)时已经从三级缓存调用AbstractAutoProxyCreator#getEarlyBeanReference创建了AOP代理,所以exposedObject与bean都是原生的Bean,二级缓存里面也是直接返回该原生Bean的AOP代理对象就行
4.AbstractAutoProxyCreator#wrapIfNecessary
protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {
// 条件一般不成立,因为咱们很少使用TargetSourceCreator 去创建对象。 BeforeInstantiation阶段。
if (StringUtils.hasLength(beanName) && this.targetSourcedBeans.contains(beanName)) {
return bean;
}
// 条件成立:说明当前beanName对应的对象 不需要被增强处理,判断是在 BeforeInstantiation阶段 做的。
if (Boolean.FALSE.equals(this.advisedBeans.get(cacheKey))) {
return bean;
}
//条件一:isInfrastructureClass 判断当前bean类型是否是 基础框架 的类型,这个类型的实例 不能被增强
//条件二:shouldSkip 判断当前beanName是否是 .ORIGINAL 结尾,如果是这个结尾 则跳过增强逻辑。
if (isInfrastructureClass(bean.getClass()) || shouldSkip(bean.getClass(), beanName)) {
this.advisedBeans.put(cacheKey, Boolean.FALSE);
return bean;
}
// Create proxy if we have advice.
// 查找适合当前bean实例Class的通知
Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);
// 条件成立:说明 上面方法 有查询到 适合当前class的通知
if (specificInterceptors != DO_NOT_PROXY) {
this.advisedBeans.put(cacheKey, Boolean.TRUE);
//创建代理对象,根据查询到的 通知 !
// 参数一:目标对象
// 参数二:beanName
// 参数三:匹配当前 目标对象 clazz 的Advisor数据。
// 参数四:目标对象。
Object proxy = createProxy(
bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));
// 保存代理对象类型。
this.proxyTypes.put(cacheKey, proxy.getClass());
//返回代理对象
return proxy;
}
//执行到这里,说明当前bean不需要被增强。
this.advisedBeans.put(cacheKey, Boolean.FALSE);
//直接返回原实例。
return bean;
}
4.1 AbstractAdvisorAutoProxyCreator#getAdvicesAndAdvisorsForBean
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();
}
4.2 AbstractAutoProxyCreator#createProxy
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);
}
// 创建代理对象 的 工厂,它必须持有 创建 代理clazz 的生产资料。
// 1.目标对象
// 2.advisor信息
ProxyFactory proxyFactory = new ProxyFactory();
// 复制一些信息 到 proxyFactory
proxyFactory.copyFrom(this);
// 条件成立:说明咱们没有使用 xml配置修改过 aop proxyTargetClass 为 true.
if (!proxyFactory.isProxyTargetClass()) {
// 是否自动设置 proxyTargetClass = true ?
// 如果bd定义内 有 preserveTargetClass = true ,那么这个bd对应的clazz 创建代理时 必须使用 cglib。
if (shouldProxyTargetClass(beanClass, beanName)) {
proxyFactory.setProxyTargetClass(true);
}
else {
// 根据目标类 判定是否可以使用 JDK 动态代理..
evaluateProxyInterfaces(beanClass, proxyFactory);
}
}
// 参数一:beanName
// 参数二:specificInterceptors 匹配当前目标对象clazz 的 advisors
Advisor[] advisors = buildAdvisors(beanName, specificInterceptors);
// 提供给ProxyFactory advisors信息。
proxyFactory.addAdvisors(advisors);
// 提供给 ProxyFactory 目标对象。
proxyFactory.setTargetSource(targetSource);
// 留给用户的扩展点
customizeProxyFactory(proxyFactory);
proxyFactory.setFrozen(this.freezeProxy);
if (advisorsPreFiltered()) {
// 设置为true ,表示传递给 proxyFactory 的这些 Advisors信息 做过基础匹配,classFilter匹配。
proxyFactory.setPreFiltered(true);
}
return proxyFactory.getProxy(getProxyClassLoader());
}