AOP动态代理解析2-代码织入入口
2016-11-18 10:58
399 查看
通过自定义配置完成了对AnnotationAwareAspectJAutoProxyCreator类型的自动注册,那么这个类到底做了什么工作来完成AOP的操作呢?首先我们看看AnnotationAwareAspectJAutoProxyCreator类的层次结构
在类的层级中,我们看到AnnotationAwareAspectJAutoProxyCreator实现了BeanPostProcessor接口,而实现BeanPostProcessor后,当Spring加载这个Bean时会在实例化前调用其postProcessAfterInitialization方法,而对于AOP逻辑的分析也由此开始。
函数中我们已经看到了代理创建的雏形。当然,真正开始之前还需要经过一些判断,比如是否已经处理过或者是否是需要跳过的bean,而真正创建代理的代码是从getAdvicesAndAdvisorsForBean开始的。
创建代理主要包含了两个步骤:
(1)获取增强方法或者增强器;
(2)根据获取的增强进行代理。
在类的层级中,我们看到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)根据获取的增强进行代理。
相关文章推荐
- AOP静态代理解析2-代码织入
- Spring4.0学习笔记007——AOP基础:动态代理、概念解析
- AOP源码解析(一)实现动态代理
- spring学习笔记(6)AOP前夕[1]jdk动态代理实例解析
- aop源码解析辅助-jdk动态代理
- Spring review--动态代理和AOP代码的演化
- AOP动态代理解析5-cglib代理的实现
- AOP动态代理解析1-标签的解析
- java使用动态代理来实现AOP(日志记录)的实例代码
- AOP——深度解析二:动态代理
- AOP动态代理解析4-代理的创建
- AOP动态代理解析4-jdk代理的实现
- AOP动态代理织入
- AOP动态代理解析3-增强方法的获取
- Spring AOP源码解析——AOP动态代理原理和实现方式
- spring学习笔记(7)AOP前夕[2]CGLib动态代理实例解析
- Spring AOP之动态代理原理解析
- java使用动态代理来实现AOP(日志记录)的实例代码
- Java动态代理示例代码
- web service (SOAP/XML-RPC) 与 动态代理、AOP