spring源码之AOP下篇

前言

上篇介绍了一些AOP的基础知识,本篇来说一下spring aop的源码分析。初读AOP时,茫然的是不知道从哪里开始,可能是当初对IOC的理解不够深刻。后面发现其实AOP的入口和IOC一样,也是从两个方法开始。一个是AbstractApplicationContext的fresh方法调用obtainFreshBeanFactory方法去读取配置文件进行初始化操作,另一个就是我的getBean方法了。

概述

在读IOC的时候,我们知道IOC分为两个过程:初始化和依赖注入,那么AOP就是在这两种过程加了特殊处理。

  • 在初始化加载Bean定义时加了特殊处理
  • 在依赖注入时加了特殊处理

初始化加载Bean定义时的特殊处理

我们在IOC中分析知道,在fresh方法中调用obtainFreshBeanFactory方法,一步步跟进去,最终会把XML的配置信息解析成一个个BeanDefinition对象并注册到DefaultListableBeanFactory上。在DefaultBeanDefinitionDocumentReader的parseBeanDefinitions方法中把对定义信息的解析分为了默认元素解析和用户元素解析。AOP的话,走的就是用户元素解析的分支。下面我们以这个为起点,进行分析。

  • root标签是默认命名空间下的,而<aop:conf>标签不是,则会走parseCustomElement方法进行解析
//DefaultBeanDefinitionDocumentReader的parseBeanDefinitions方法//默认命名空间下的标签走默认标签解析的方法(比如<bean>),用户标签走用户标签解析的方法(比如<aop:conf>)//这里走用户定义的解析方式protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {
if (delegate.isDefaultNamespace(root)) {
        NodeList nl = root.getChildNodes();
        for (int i = 0; i < nl.getLength(); i++) {
            Node node = nl.item(i);
            if (node instanceof Element) {
                Element ele = (Element) node;
                if (delegate.isDefaultNamespace(ele)) {
                    parseDefaultElement(ele, delegate);
                }
                else {
                    delegate.parseCustomElement(ele);
                }
            }
        }
    }
    else {
        delegate.parseCustomElement(root);
    }
}
  • 111

Spring中的配置

在spring使用AOP时,我们一般使用两种方式:注解方式和XML配置方式

  • XML方式

  

  • 注解方式

  

总结

  • spring中对AspectJ提供了支持,这块没有去研究过
  • 这篇只是对一些基础概念和常用的两种使用方式进行说明,下篇深入到spring aop的源码

参考链接

  • https://wenku.baidu.com/view/6ce3121da300a6c30c229f89.html(核心关注点与横切关注点)
  • https://www.cnblogs.com/syf/archive/2012/05/09/2491780.html(OOP与AOP)
  • https://blog.csdn.net/garfielder007/article/details/78057107(连接点用地概念)
  • https://docs.spring.io/spring/docs/4.3.18.RELEASE/spring-framework-reference(spring官方文档)

原文地址:https://www.cnblogs.com/lucas2/p/9309539.html

时间: 2024-10-25 11:15:20

spring源码之AOP下篇的相关文章

Spring源码分析——AOP实现(2)

文章深入讲解了Spring中AOP的实现机制和原理以及使用 AOP(Aspect Orient Programming),作为面向对象编程的一种补充,广泛应用于处理一些具有横切性质的系统级服务,如事务管理.安全检查.缓存.对象池管理等.AOP 实现的关键就在于 AOP 框架自动创建的 AOP 代理,AOP 代理则可分为静态代理和动态代理两大类,其中静态代理是指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强:而动态代理则在运行时借助于 JDK 动

spring源码解读-aop

aop是指面向切面编程,ProxyFactoryBean是spring aop的底层实现与源头,为什么这么说呢?首先我们看一段配置: 1.target是目标对象,需要对其进行切面增强 2.proxyInterfaces是指代理对象所实现的接口 3.interceptorNames:是指通知器(Advisor)列表,通知器中包含了通知advice与切点pointcut 概括一下,ProxyFactoryBean的作用是: 针对目标对象来创建代理对象,将对目标对象方法的调用转到对相应代理对象方法的调

AOP执行增强-Spring 源码系列(5)

AOP增强实现-Spring 源码系列(5) 目录: Ioc容器beanDefinition-Spring 源码(1) Ioc容器依赖注入-Spring 源码(2) Ioc容器BeanPostProcessor-Spring 源码(3) 事件机制-Spring 源码(4) AOP执行增强-Spring 源码系列(5) AOP的核心就是个动态代理,Spring进行了大量抽象和封装形成一个方便上层使用的基础模块. 而动态代理的两种实现都在上一篇中提供了代码 直接ProxyFactoryBean入手来

spring源码剖析(六)AOP实现原理剖析

Spring的AOP实现原理,酝酿了一些日子,写博客之前信心不是很足,所以重新阅读了一边AOP的实现核心代码,而且又从网上找了一些Spring Aop剖析的例子,但是发现挂羊头买狗肉的太多,标题高大上,内容却大部分都是比较浅显的一些介绍,可能也是由于比较少人阅读这部分的核心代码逻辑把,然后写这部分介绍的人估计也是少之又少,不过说实话,Spring Aop的核心原理实现介绍确实不太好写,里面涉及的类之间的调用还是蛮多的,关系图画的太细的画也很难画,而且最重要的一点就是,如果对AOP的概念以及spr

Spring源码阅读:Spring AOP设计与实现(一):动态代理

在Spring的有两个核心:IOC与AOP,AOP又是基于动态代理模式实现的.所以要了解SpringAOP是如何设计的之前,还是先了解一下Java中的动态代理比较好. 认识代理模式 代理模式是这么描述的: 代理模式是为其他对象提供一种代理以控制对这个对象的访问 代理对象的功能: 通过创建一个代理对象,用这个代理对象去代理真实的对象,客户端得到这个代理对象后,对客户端并没有什么影响,就跟真实的对象一样(因为代理对象和真是对象实现了同一接口). 下面看看代理模式的类图: 解说: RealSubjec

Spring源码阅读:使用标准AOP的API模拟Spring AOP + AspectJ的设计与实现

在上一篇博客中,提到了标准AOP与Spring AOP.这一篇就来把他们模拟出来. 在模拟之前,还需要提及的是,在Spring框架中,对于AOP的支持: Spring 支持的AOP AspectJ是另外一个有名的AOP框架,Spring也集成AspectJ,同时Spring AOP与AspectJ有一定程度的集成,这样一来Spring中就支持两种AOP:1)Spring AOP.2)AspectJ.而使用AOP的方式却又三种: 1)完全使用Spring AOP 2)完全使用AspectJ(分为注

【Spring源码分析】非懒加载的Bean实例化过程(下篇)

doCreateBean方法 上文[Spring源码分析]非懒加载的Bean实例化过程(上篇),分析了单例的Bean初始化流程,并跟踪代码进入了主流程,看到了Bean是如何被实例化出来的.先贴一下AbstractAutowireCapableBeanFactory的doCreateBean方法代码: 1 protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[]

Spring源码系列 — BeanDefinition扩展点

前言 前文介绍了Spring Bean的生命周期,也算是XML IOC系列的完结.但是Spring的博大精深,还有很多盲点需要摸索.整合前面的系列文章,从Resource到BeanDefinition,再到容器扩展点,最后到Bean创键,这个过程中无处不存在Spring预留的扩展口. 本篇文章介绍Spring的另一种扩展点:BeanDefinition扩展点,该扩展点是为处理BeanDefinition而设计.本文主要从以下几点分析: BeanDefinition扩展点的几种方式 BeanDef

spring源码分析

spring源码剖析(九)springMVC源码剖析 springMVC 相信大伙都用过,但是spring框架对于你请求的一个url 到你看到的返回结果,期间做了哪些出来呢,文件上传的封装?controller的寻找?过滤器的调用?AOP的调用?视图的解析?页面的跳转?  这些过程具体是怎么实现的,下面我们一一来向大家介绍springMVC的架构.... 2017-02-26 14:02 阅读(248) 评论(0) spring源码剖析(八)spring整合mybatis原理 MyBatis相信