没有合适的资源?快使用搜索试试~ 我知道了~
Spring框架系列(9) - Spring AOP实现原理详解之AOP切面的实现.doc
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 123 浏览量
2022-07-08
17:55:06
上传
评论
收藏 5.89MB DOC 举报
温馨提示
试读
25页
Spring框架系列(9) - Spring AOP实现原理详解之AOP切面的实现.doc
资源推荐
资源详情
资源评论
Spring 框架系列(9) - Spring AOP 实现原理详解之 AOP 切面的实现
前文,我们分析了 Spring IOC 的初始化过程和 Bean 的生命周期等,而 Spring AOP 也是
基于 IOC 的 Bean 加载来实现的。本文主要介绍 Spring AOP 原理解析的切面实现过程(将
切面类的所有切面方法根据使用的注解生成对应 Advice,并将 Advice 连同切入点匹配器和
切面类等信息一并封装到 Advisor,为后续交给代理增强实现做准备的过程)。@pdai
Spring 框架系列(9) - Spring AOP 实现原理详解之 AOP 切面的实现
引入
aop 配置标签的解析
config 配置标签的解析
aspectj-autoproxy 配置标签的解析
注解切面代理创建类(AnnotationAwareAspectJAutoProxyCreator)
postProcessBeforeInstantiation
判断是否是 aop 基础类
是否应该跳过 shouldSkip
切面方法转成 Advisor
获取表达式的切点
封装成 Advisor
小结
postProcessAfterInitialization
总结
更多文章
引入
我们应该从哪里开始着手看 Spring AOP 的源码呢?和我们上文分析的 IOC 源码实现有
什么关系呢?
前文中我们写了 AOP 的 Demo,根据其 XML 配置我们不难发现 AOP 是基于 IOC 的 Bean
加载来实现的;这便使我们的主要入口
所以理解 Spring AOP 的初始化必须要先理解 Spring IOC 的初始化。
然后我们就能找到如下初始化的流程和 aop 对应的 handler 类
即 parseCustomElement 方 法 找 到 parse aop:aspectj-autoproxy 的
handler(org.springframework.aop.config.AopNamespaceHandler)
(PS:其实你会发现,最重要的是知识点的关联关系,而不是知识点本身,就后续代码
而言不就是打个断点慢慢看的事了么。)
aop 配置标签的解析
上文中,我们找到了 AopNamespaceHandler,其实就是注册 BeanDefinition 的解析器
BeanDefinitionParser,将 aop:xxxxxx 配置标签交给指定的 parser 来处理。
public class AopNamespaceHandler extends NamespaceHandlerSupport {
/**
* Register the {@link BeanDefinitionParser BeanDefinitionParsers} for the
* ‘{@code config}’, ‘{@code spring-configured}’, ‘{@code aspectj-autoproxy}’
* and ‘{@code scoped-proxy}’ tags.
*/
@Override
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());
}
}
config 配置标签的解析
由 ConfigBeanDefinitionParser 这个类处理,作为 parser 类最重要的就是 parse 方法
@Override
@Nullable
public BeanDefinition parse(Element element, ParserContext parserContext) {
CompositeComponentDefinition compositeDef =
new CompositeComponentDefinition(element.getTagName(),
parserContext.extractSource(element));
parserContext.pushContainingComponent(compositeDef);
configureAutoProxyCreator(parserContext, element);
List childElts = DomUtils.getChildElements(element);
for (Element elt: childElts) {
String localName = parserContext.getDelegate().getLocalName(elt);
if (POINTCUT.equals(localName)) {
parsePointcut(elt, parserContext);
}
else if (ADVISOR.equals(localName)) {
parseAdvisor(elt, parserContext);
}
else if (ASPECT.equals(localName)) {
parseAspect(elt, parserContext);
}
}
parserContext.popAndRegisterContainingComponent();
return null;
}
打个断点看下
剩余24页未读,继续阅读
资源评论
书博教育
- 粉丝: 1
- 资源: 2837
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功