Spring的AOP

aop概述

Aspect Oriented Programing 面向切面(方面)编程,

aop:扩展功能不修改源代码实现

aop采取横向抽取机制,取代了传统纵向继承体系重复性代码(性能监视、事务管理、安全检查、缓存)

aop原理

  1. 横向抽取机制

    扩展功能:

    添加数据之后,添加日志功能,添加之后,记录在什么时间添加哪个用户

    传统方式:

    1. public class User{
    2. //添加新用户的方法
    3. public void add(){
    4. //添加逻辑
    5. //传统方式:在此修改源代码,添加日志逻辑
    6. }
    7. }

    ------》解决方案:纵向抽取机制

    缺陷:父类方法名字发生变化,在子类调用的方法也需要变化

    1. public class BaseUser{
    2. //创建添加日志的方法
    3. public void weitelog(){
    4. //添加日志逻辑
    5. }
    6. }
    7. public class User extends BaseUser{
    8. //添加新用户的方法
    9. public void add(){
    10. //添加逻辑
    11. //功能扩展,添加日志的功能
    12. //调用父类方法实现日志功能
    13. super.writelog();
    14. }
    15. }

    ——》横向抽取机制

    aop:横向抽取机制

    底层使用 动态代理方式实现

    第一种情况

    ​ 使用动态代理方式,创建接口实现类代理对象

    ​ 创建一个和DaoImpl平级对象

    ​ 这个对象不是真的对象,代理对象

    ​ 实现DaoImpl相同的功能

    1. public interface Dao{
    2. public void add();
    3. }
    4. public class DaoImpl implements Dao{
    5. public void add(){
    6. //添加逻辑
    7. }
    8. }

    第二种情况 没有接口的情况

    使用cglib代理,没有借口情况

    1. public class User{
    2. public void add(){
    3. }
    4. }
    5. /*动态代理实现
    6. *创建Uesr类的子类的对象
    7. *在子类里面调用父类方法完成增强
    8. */

aop操作相关术语

pointcut(切入点)

在类里面可以有很多方法被增强,比如实际操作中,只是增强了类里面add的方法和update方法,实际增强的方法被称为切入点

Advice(增强)

实际增强的逻辑,称为增强,比如扩展日志功能,这个日志功能称为增强

增强(通知)有以下的分类

名称 介绍
前置通知 在方法之前执行
后置通知 在方法之后执行
异常通知 方法出现异常后执行
最终通知 在后置之后执行
环绕通知 在方法之前和之后执行

Aspect(切面)

在增强应用到具体的方法上面,过程称为切面,

切面是切入点和通知(引介)的结合

以下不常用,了解即可

Joinpoint:连接点:类里面那些方法可以被增强,这些方法被称为连接点

Introduction(引介):在不修改类代码的前提上,动态添加属性和方法

Target(目标对象):要增强的类

Weaving(织入):把增强应用到目标的过程

Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类

  1. public class User{
  2. public void add(){}
  3. public void update(){}
  4. public void delete(){
  5. }
  6. public void findAll(){}
  7. }

基于aspectj的AOP

基于aspectj的xml准备工作

@AspectJ简介

在Spring里面进行aop操作,使用aspectj实现
  1. AspectJ不是Spring的一部分,和是Spring一起使用进行AOP操作
  2. Spring2.0以后增加了对AspectJ的支持
  3. 新版本Spring建议使用AspectJ进行AOP操作
使用AspectJ实现AOP有两种方式
  1. 基于AspectJ的xml配置
  2. 基于AspectJ的注解方式

AOP操作的准备

  • 需要导入aop相关的jar包:aspects aop。

    1. <dependency>
    2. <groupId>org.springframework</groupId>
    3. <artifactId>spring-aop</artifactId>
    4. <version>5.1.8.RELEASE</version>
    5. </dependency>
    6. <dependency>
    7. <groupId>org.springframework</groupId>
    8. <artifactId>spring-aspects</artifactId>
    9. <version>5.1.8.RELEASE</version>
    10. </dependency>
    11. <dependency>
    12. <groupId>org.aspectj</groupId>
    13. <artifactId>aspectjweaver</artifactId>
    14. <version>LATEST</version>
    15. </dependency>
    16. <dependency>
    17. <groupId>aopalliance</groupId>
    18. <artifactId>aopalliance</artifactId>
    19. <version>1.0</version>
    20. </dependency>
  • 创建spring核心配置文件,引入aop的相关约束:the aop schema

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:aop="http://www.springframework.org/schema/aop"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  6. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
  7. </beans>

使用表达式配置切入点

  1. 切入点:实际增强的方法

  2. 常用的表达式

    execution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>) 作用对象
    execution(* aop.Book.add(…)) 某个方法
    execution(* aop.Book.*(…)) 某个类的所有方法
    execution(* *.*.*(..)) 所有
    execution(* save*(…)) 匹配所以save开头的方法

    前后置通知基本相同

    1. <bean id="book" class="aop.Book"></bean>
    2. <bean id="mybook" class="aop.MyBokk"></bean>
    3. <!-- 配置aop操作-->
    4. <aop:config>
    5. <!-- 配置切入点-->
    6. <aop:pointcut id="pointcut1" expression="execution(* aop.Book.add(..))"/>
    7. <aop:aspect ref="mybook">
    8. <!-- 配置增强的类型
    9. method:增强类里面使用哪个方法作为前置
    10. pointcut-ref:作用于哪一个切入点
    11. -->
    12. <aop:before method="before1" pointcut-ref="pointcut1"></aop:before>
    13. </aop:aspect>
    14. </aop:config>

    环绕通知

    1. public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
    2. //方法之前
    3. System.out.println("方法之前。。。。。。。");
    4. //抛出异常
    5. proceedingJoinPoint.proceed();
    6. //方法之后
    7. System.out.println("方法之后........");
    8. }
    1. <aop:around method="around" pointcut-ref="pointcut1"></aop:around>

    基于Aspect实现AOP(注解)

首先在配置文件中开启aop自动代理

  1. <aop:aspectj-autoproxy/>

然后在增强类中编写注解

  1. @Aspect
  2. public class MyBook {
  3. @Before(value = "execution(* aop.Book.*(..))")
  4. public void before1(){
  5. System.out.println("前置增强.......");
  6. }
  7. /**
  8. *
  9. * @param proceedingJoinPoint 用此调用被环绕的对象
  10. */
  11. @Around(value = "execution(* aop.Book.*(..))")
  12. public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
  13. //方法之前
  14. System.out.println("方法之前。。。。。。。");
  15. //抛出异常
  16. proceedingJoinPoint.proceed();
  17. //方法之后
  18. System.out.println("方法之后........");
  19. }
  20. }

@AspectJ提供不同的通知类型

  • @Before前置通知,相当于BeforeAdvice
  • @AfterReturning后置通知,相当于AfterReturningAdvice
  • @Around 环绕通知,相当于MethodIntercepetor
  • @AfterThrowing抛出通知,相当于ThrowAdvice
  • @After 最终final通知,不管是否异常,该通知都会执行

SpringAOP入门的更多相关文章

  1. Spring-Aop入门

    (一)Aop术语定义 1.通知(advice) 通知定义了切面要做什么工作,即调用的方法,同时定义了什么时候做这些工作,即以下五种类型 (1)前置通知(Before) :在目标方法调用之前执行切面方法 ...

  2. 一篇文章带你掌握主流基础框架——Spring

    一篇文章带你掌握主流基础框架--Spring 这篇文章中我们将会介绍Spring的框架以及本体内容,包括核心容器,注解开发,AOP以及事务等内容 那么简单说明一下Spring的必要性: Spring技 ...

  3. 带你入门代理模式/SpringAop的运行机制

    SpringAop 是spring框架中最重要的一项功能之一,同时也是企业级开发记录事物日志等不可或缺的一部分,如果说你的系统需要记录用户访问接口的操作,那SpringAop是很完美的了,当然,拦截器 ...

  4. SpringAOP简单入门

    注解形式 步骤一.定义一个interface public interface ArithmeticCalculator { double plus(int i, int j); double sub ...

  5. Spring MVC入门

    1.什么是SpringMvc Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 M ...

  6. SpringMVC入门案例及请求流程图(关于处理器或视图解析器或处理器映射器等的初步配置)

    SpringMVC简介:SpringMVC也叫Spring Web mvc,属于表现层的框架.Spring MVC是Spring框架的一部分,是在Spring3.0后发布的 Spring结构图 Spr ...

  7. SpringMvc核心流程以及入门案例的搭建

    1.什么是SpringMvc Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 M ...

  8. SpringMVC之入门

    Spring MVC简介 Spring MVC:Spring MVC也叫Spring Web MVC,属于表现层框架,是Spring中的一份子. Spring MVC执行流程图 第一个SpringMV ...

  9. [Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.

    前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习 ...

随机推荐

  1. 025.掌握Service-SVC基础使用

    一 Service简介 1.1 Service概念 Service是Kubernetes的核心概念,通过创建Service,可以为一组具有相同功能的容器应用提供一个统一的入口地址,并且将请求负载分发到 ...

  2. JavaScript实现集合与字典

    JavaScript实现集合与字典 一.集合结构 1.1.简介 集合比较常见的实现方式是哈希表,这里使用JavaScript的Object类进行封装. 集合通常是由一组无序的.不能重复的元素构成. 数 ...

  3. 深入理解 vertical-align 属性

    语法 用来指定行内元素或表格元素的垂直对齐方式 相对父元素的值 baseline 使元素的基线与父元素的基线对齐.HTML规范没有详细说明部分可替换元素的基线,如textarea,这意味着这些元素使用 ...

  4. Vue2.0 【第一季】第1节 走进我的Vue2.0

    目录 Vue2.0 [第一季]内部指令 第一节 走进我的Vue2.0 Vue2.0 [第一季]内部指令 记录一下我的代码地址:D:/Code/Vue 编辑器:VS code 前置知识: 1.HTML的 ...

  5. git基础教程(八)

    8. gitlab相关介绍 8.1 gitlab优势 社区版本,自己可以在公司搭建环境 维护人员多,版本更新块 易用性强,上手快 集成CI(持续集成) 集成CD(持续发布) 8.2 持续集成 8.2. ...

  6. go例子(一) 使用go语言实现linux内核中的list_head

    package list 代码 package list import ( "fmt" ) // 数据接口 type ElemType interface{} // 节点 type ...

  7. python基于scrapy框架的反爬虫机制破解之User-Agent伪装

    user agent是指用户代理,简称 UA. 作用:使服务器能够识别客户使用的操作系统及版本.CPU 类型.浏览器及版本.浏览器渲染引擎.浏览器语言.浏览器插件等. 网站常常通过判断 UA 来给不同 ...

  8. 小白学 Python 数据分析(20):pyecharts 概述

    人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...

  9. CodeMixer工具,完美替代ChaosTool,iOS添加垃圾代码工具,代码混淆工具,代码生成器,史上最好用的垃圾代码添加工具,自己开发的小工具

    新工具 ProjectTool 已上线 这是一款快速写白包工具,秒级别写H5游戏壳包,可视化操作,极易使用,支持Swift.Objecive-C双语言 扣扣交流群:811715780 进入 Proje ...

  10. Journal of Proteome Research | Clinically Applicable Deep Learning Algorithm Using Quantitative Proteomic Data (分享人:翁海玉)

    题目:Clinically Applicable Deep Learning Algorithm Using Quantitative Proteomic Data 期刊:Journal of Pro ...