Spring架构揭秘-AOP

1、AOP概述

2、Spring AOP原理

3、Spring AOP架构解析

一、AOP概述

Java程序员在写代码的时候通常都是使用新建对象类来描述业务特性,然后通过对象的继承、组合、扩展等手段来实现业务需求,这是典型的面相对象的编程方式即OOP,总的来说OOP是一种由上至下的竖向编程模式。

在实际的编程中,通常会遇到某些方法里会使用到相同的逻辑,比如记方法执行日志,这些代码在OOP中没法与业务代码完全的解藕,使得方法代码就有了混合逻辑,不符合编程的单一责任原则。如果可以把这块逻辑代码解藕,通把两种逻辑的代码区分开,然后在运行期再合起来就完美了,就相当于在运行期横向的添砖加瓦,也就是面向切面横向的编程即AOP。

二、Spring AOP原理

实现AOP的主要技术就是动态代理,动态代理的原理这里就不细说了,主要是来看看Spring AOP的实现原理下载。我们知道通常使用的动态代理技术有JDK的和CGLIB的,其中JDK的动态代理只能代理接口级别,而CGLIB则还可以代理类级别,在Spring中结合了这两者,使得其更灵活。

在细说Spring AOP原理之前先来看看以下几个重要的概念:

a、连接点(JoinPoint):程序执行的莫个特定位置,比如类初始化之前,类初始化之后,方法执行之前,方法执行之后,异常抛出之后等等。

b、切点(PointCut):指定程序执行的位置,每个类对象都有多个JoinPoint,那么到底要在哪个JoinPoint上执行呢?这就需要用PointCut来指定,通常一个PointCut可以对应多个JoinPoint。

c、增强(Advice):增强就是织入到目标类连接点上的一段程序代码,不少地方叫它通知,笔者觉得叫增强更能表达其含义。Spring 中有BeforeAdvice,AfterAdvice等。其中AOP联盟定义了标准接口Advice,Spring AOP也是基于它进行扩展的。

d、切面(Aspect):切面是切点和增强的组合,Spring AOP就是切面的实施框架,将切面中定义的增强逻辑实施到切面中指定的连结点中去。

e、代理(Proxy):一个类被织入增强的代码后就会产生一个代理类,在运行期真正被执行的对象。

下面用图来说一下Spring AOP的原理。下载

Spring在初始化容器的时候会扫描相关的配置,包括XML、Annotation等,发现有标注了Aspect的Bean后会根据切面中切点定义找到目标类,并且为其织入增强代码并且通过代理生成器生成代理对象,然后供用户使用。

三、Spring AOP架构解析下载

下面用图来阐述Spring AOP的主要组成部分以及其组件结构,先来看看Spring AOP的组件图

Spring的AOP主要由四大组件构成,分别是切点组件、切面组件、增强组件、代理组件。下载

根据这四大组件,来看看具体的类图。

切点组件类图:

PointCut接口只定义了两个方法,一个是getClassFilter()用于获取过滤器,判别切点能否用于目标类上,另一个则是getMethodMatcher()用于获取方法匹配器,spring提供静态和动态的方法匹配器下载,除此外还有别的方法匹配器,这里就不列举了,静态方法匹配器仅根据方法签名进行匹配,不关心运行时的参数,只匹配一次,而动态方法匹配器则因为每次方法执行传入的参数可能不一样,所以每次调用方法都需要判断,对性能影响较大。

增强组件类图:

AOP联盟定义了AOP的标准,其中一个就是Advice增强接口,各大AOP框架都基于它来进行扩展,其中Spring就在它的基础上扩展了AfterAdvice,BeforeAdvice,DynamicIntroductionAdvice,Inteceptor也是AOP联盟定义的一个接口,用于环绕增强,即在方法执行的前后都织入增强逻辑下载

代理组件类图

在Spring里,当容器初始化时扫描到切面类就会通过ProxyFactory的getProxy()来获取代理对象,然后加入Bean存储器供使用。从上图中可以清晰的看出Spring支持JDK和Cglib两种动态代理方式。

切面组件类图

AOP总架构类图

通过最后的总架构类图就很清楚的知道Spring AOP框架的结构以及其个组件之间的组合关系

时间: 2024-10-03 17:45:02

Spring架构揭秘-AOP的相关文章

Spring架构揭秘-事件监听机制

一.事件监听机制概述 二.事件监听机制结构 三.Spring监听机制架构 Spring的Application拥有发布事件并且注册事件监听器的能力,拥有一套完整的事件发布和监听机制.在Java中,通过java.util. EventObject来描述事件,通过java.util. EventListener来描述事件监听器,在众多的框架和组件中,建立一套事件机制通常是基于这两个接口来进行扩展. 在一个事件体系中,有以下几个重要的概念. 1.事件源:事件对象的产生者,任何一个EventObject

Spring 架构的简单模拟实现

Spring 架构主要有两大特点: IOC /DI: 控制反转/依赖注入 AOP  切面编程 . 今天主要是实现IOC这一特点. 主要的逻辑如下: User 用户类. UserDAO  User类的访问接口. UserDAOImpl  实现UserDAO 接口以实现拓展. UserService  包含一系列的用户功能 ,如addUser 关于以上类的代码: package com.bjsxt.model; public class User { private String username;

Spring Boot 揭秘与实战 附录 - Spring Boot 公共配置

Spring Boot 公共配置,配置 application.properties/application.yml 文件中. 摘自:http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html # =================================================================== # COMMON SPRING

java架构解密——AOP之动态代理实现

在上篇博客中,我们在宏观上介绍了AOP的底层实现,具体见博客java架构解密--Spring框架的AOP,在博客中,我们讲述了Aop的一些设计上的思路,今天,咱们就具体的实现,和大家一起探讨,看看AOP是怎么一步一步走到今天,而且有些图,也要做些纠正! 一,代码演变 前提:最初要实现的功能(打招呼) 代码: 接口: <span style="font-size:18px;">public interface Greeting { void sayHello(String n

Spring(十一)之AOP

Spring 框架的一个关键组件是面向方面的编程(AOP)框架.面向方面的编程需要把程序逻辑分解成不同的部分称为所谓的关注点.跨一个应用程序的多个点的功能被称为横切关注点,这些横切关注点在概念上独立于应用程序的业务逻辑.有各种各样的常见的很好的方面的例子,如日志记录.审计.声明式事务.安全性和缓存等. 在 OOP 中,关键单元模块度是类,而在 AOP 中单元模块度是方面.依赖注入帮助你对应用程序对象相互解耦和 AOP 可以帮助你从它们所影响的对象中对横切关注点解耦.AOP 是像编程语言的触发物,

springMVC+MyBatis+Spring 整合(4) ---解决Spring MVC 对AOP不起作用的问题

解决Spring MVC 对AOP不起作用的问题 分类: SpringMVC3x+Spring3x+MyBatis3x myibaits spring J2EE2013-11-21 11:22 640人阅读 评论(1) 收藏 举报 用的是 SSM3的框架 Spring MVC 3.1 + Spring 3.1 + Mybatis3.1第一种情况:Spring MVC 和 Spring 整合的时候,SpringMVC的springmvc.xml文件中 配置扫描包,不要包含 service的注解,S

spring中的aop注解(整合junit测试)

使用spring中的aop前先来了解一下spring中aop中的一些名词 Joimpoint(连接点):目标对象中,所有可能增强的方法 PointCut(切入点):目标对象,已经增强的方法 Advice(通知/增强):增强的代码 Target(目标对象):被代理对象 Weaving(织入):将通知应用到切入点的过程 Proxy(代理):将通知织入到目标对象之后,形成代理对象 aspect(切面):切入点+通知 一:不使用spring的aop注解 以javaEE中的service层为例 UserS

Spring Boot学习——AOP编程的简单实现

首先应该明白一点,AOP是一种编程范式,是一种程序设计思想,与具体的计算机编程语言无关,所以不止是Java,像.Net等其他编程语言也有AOP的实现方式.AOP的思想理念就是将通用逻辑从业务逻辑中分离出来. 本文将通过一个HTTP请求的例子简单的讲解Spring Boot中AOP的应用,步骤如下: 第一步,添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spr

Spring核心框架 - AOP的原理及源码解析

一.AOP的体系结构 如下图所示:(引自AOP联盟) 层次3语言和开发环境:基础是指待增加对象或者目标对象:切面通常包括对于基础的增加应用:配置是指AOP体系中提供的配置环境或者编织配置,通过该配置AOP将基础和切面结合起来,从而完成切面对目标对象的编织实现. 层次2面向方面系统:配置模型,逻辑配置和AOP模型是为上策的语言和开发环境提供支持的,主要功能是将需要增强的目标对象.切面和配置使用AOP的API转换.抽象.封装成面向方面中的逻辑模型. 层次1底层编织实现模块:主要是将面向方面系统抽象封