AOP动态代理解析2-代码织入入口

简介: 通过自定义配置完成了对AnnotationAwareAspectJAutoProxyCreator类型的自动注册,那么这个类到底做了什么工作来完成AOP的操作呢?首先我们看看AnnotationAwareAspectJAutoProxyCreator类的层次结构在类的层级中,我们看到Annota...

通过自定义配置完成了对AnnotationAwareAspectJAutoProxyCreator类型的自动注册,那么这个类到底做了什么工作来完成AOP的操作呢?首先我们看看AnnotationAwareAspectJAutoProxyCreator类的层次结构

在类的层级中,我们看到AnnotationAwareAspectJAutoProxyCreator实现了BeanPostProcessor接口,而实现BeanPostProcessor后,当Spring加载这个Bean时会在实例化前调用其postProcessAfterInitialization方法,而对于AOP逻辑的分析也由此开始。

public Object postProcessAfterInitialization(Object bean, String beanName)  
    throws BeansException  
{  
    if(bean != null)  
    {  
        //根据给定的bean的class和name构建出个key,格式:beanClassName_beanName  
       Object cacheKey = getCacheKey(bean.getClass(), beanName);  
        if(!earlyProxyReferences.containsKey(cacheKey))  
           //如果它适合被代理,则需要封装指定bean  
          return wrapIfNecessary(bean, beanName, cacheKey);  
    }  
    return bean;  
}  
protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey)  
   {  
       //如果已经处理过  
      if(beanName != null && targetSourcedBeans.containsKey(beanName))  
           return bean;  
       //无需增强  
      if(Boolean.FALSE.equals(advisedBeans.get(cacheKey)))  
           return bean;  
       //给定的bean类是否代表一个基础设施类,基础设施类不应代理,或者配置了指定bean不需要自动代理  
      if(isInfrastructureClass(bean.getClass()) || shouldSkip(bean.getClass(), beanName))  
       {  
           advisedBeans.put(cacheKey, Boolean.FALSE);  
           return bean;  
       }  
       //如果存在增强方法则创建代理  
      Object specificInterceptors[] = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);  
       //如果获取到了增强则需要针对增强创建代理  
       if(specificInterceptors != DO_NOT_PROXY)  
       {  
           advisedBeans.put(cacheKey, Boolean.TRUE);  
           //创建代理  
           Object proxy = createProxy(bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));  
           proxyTypes.put(cacheKey, proxy.getClass());  
           return proxy;  
       } else  
       {  
           advisedBeans.put(cacheKey, Boolean.FALSE);  
           return bean;  
       }  
   }  

函数中我们已经看到了代理创建的雏形。当然,真正开始之前还需要经过一些判断,比如是否已经处理过或者是否是需要跳过的bean,而真正创建代理的代码是从getAdvicesAndAdvisorsForBean开始的。

创建代理主要包含了两个步骤:

(1)获取增强方法或者增强器

(2)根据获取的增强进行代理

 

 

目录
相关文章
|
9天前
|
Java
Java中ReentrantLock释放锁代码解析
Java中ReentrantLock释放锁代码解析
25 8
|
25天前
|
机器学习/深度学习 算法 PyTorch
RPN(Region Proposal Networks)候选区域网络算法解析(附PyTorch代码)
RPN(Region Proposal Networks)候选区域网络算法解析(附PyTorch代码)
180 1
|
25天前
|
存储 C# 容器
C变量数据类型深度解析:打造高效代码的基石
C变量数据类型深度解析:打造高效代码的基石
13 1
|
1月前
|
监控 Java 开发者
Spring AOP动态代理
Spring AOP动态代理
40 1
|
1月前
|
安全 Java
Java 枚举(Enums)解析:提高代码可读性与易维护性
在 Java 中,实现抽象的另一种方式是使用接口。 接口定义 接口是一个完全抽象的类,用于将具有空方法体的相关方法分组:
69 1
|
1月前
|
缓存 人工智能 监控
AOP:让你的代码像超级英雄一样飞翔
AOP:让你的代码像超级英雄一样飞翔
|
7天前
|
Java 数据库 Spring
切面编程的艺术:Spring动态代理解析与实战
切面编程的艺术:Spring动态代理解析与实战
23 0
切面编程的艺术:Spring动态代理解析与实战
|
25天前
|
机器学习/深度学习 存储 Java
揭秘数组:数据结构的基石与代码实践解析
揭秘数组:数据结构的基石与代码实践解析
8 0
|
25天前
|
Python
继承概念深度解析:代码视角下的科普之旅
继承概念深度解析:代码视角下的科普之旅
6 0
|
25天前
|
设计模式 缓存 Java
单例模式解析:从理论到代码实践
单例模式解析:从理论到代码实践
11 0

推荐镜像

更多