AOP(面向切面编程)

面向切面编程, 即利用AOP可以对业务逻辑的各个部分进行隔离, 从而使得业务逻辑各个部分之间的耦合度降低, 提高程序的可重用性, 同时提高了开发的效率.

不通过修改源代码,通过加上一个模块就在原有代码的功能上增加一个新功能

底层原理

  AOP通过代理对象的方式来增强其他的类的功能, 从而避免修改源代码, 根据待增强类有无实现接口, 可以将代理对象分为两类:

  1. 有接口情况, 使用JDK动态代理: 即创建原来接口实现类的代理对象, 用此对象去增强待增强类;即为动态代理
  2. 无接口情况, 使用CGLIB动态代理: 创建当前类的子类的代理对象, 用此对象去增强;

AOP术语

1. 连接点

  类中可以被增强的方法被称为连接点

2. 切入点

  类中实际被增强的方法成为切入点

3.通知(增强)

  实际增强的逻辑部分称为通知(增强)

  通知(增强)有多种类型:

  • 前置通知: 在切入点之前执行的通知
  • 后置通知: 在切入点之后执行的通知
  • 环绕通知: 在切入点前后都执行的通知
  • 异常通知: 在切入点发生异常时执行的通知
  • 最终通知: 相当于Java中的finally, 即无论发生异常都执行的通知

4. 切面

  切面就是指把通知应用到切入点的过程

AOP操作(准备)

什么是aspectj?

aspectj不是Spring组成部分,是一个独立的AOP框架,一般把aspectj和spring框架一起使用,进行AOP操作

基于sapectj实现AOP操作的两种方式:

  • 基于xml配置文件实现

  • 基于注解方式实现(现在使用)

切入点表达式

  作用: 知道对哪个类里面的哪个方法进行增强

  语法结构: execution([权限修饰符] [返回类型] [类全路径] 方法名称)

  举例说明:

  例1. 对com.ryan.class 类里面的 add 方法进行增强:

    execution(* com.ryan.class.add(..))

    说明: 权限修饰符可以省略,*表示任意放回值, (..)表示所有参数

  例2. 对com.ryan.class 类里面的所有方法进行增强:

    execution(* com.ryan.class.*(..))

  例3. 对com.ryan 包里面的所有类中的所有方法进行增强:

    execution(* com.ryan..(..))

AOP操作(AspectJ注解)

流程了解

(1)创建被增强类和增强代理类

(2)在spring配置文件中,开启注解扫描

(3)使用注解创建User和UserProxy

(4)在增强代理类上添加注解@Aspect

(5)在spring配置文件中开启生成代理对象

创建被增强类,并添加注解

package com.wang.AOPanno;

@component
public class User {
public void add(){
System.out.println("add____________________");
}
}

创建增强类,并添加注解

package com.wang.AOPanno;

@Component
@Aspect
public class UserProxy { @Before(value = "execution(* com.wang.AOPanno.User.add(..))")
public void before(){
System.out.println("before");
}
}

开启扫描,并在spring配置文件中开启生成代理对象

<!--开启扫描-->
<context:component-scan base-package="com.wang.AOPanno"></context:component-scan>
<!--开启代理生成-->
<aop:aspectj-autoproxy ></aop:aspectj-autoproxy>

测试

@org.junit.Test
public void test1(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");
User user = context.getBean("user", User.class);
//调用方法,出现了前置方法则为成功
user.add();
}

了解各种方法的执行关系

其他注解拓展操作

抽取相同切入点(@Pointcut注解

@Component
@Aspect
public class UserProxy {
@Pointcut(value = "execution(* com.wang.AOPanno.User.add(..))")
public void pointdemo(){}; @Before(value = "pointdemo()")
public void before(){
System.out.println("before");
}
}

多个代理类对同一个类增强时的优先级(@order(数字))

数字越小优先级越高

@Component
@Aspect
@Order(1)
public class UserProxy {...}
@Component
@Aspect
@Order(3)
public class PersonProxy {...}

spring-2-AOP的更多相关文章

  1. Spring基于AOP的事务管理

                                  Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...

  2. Spring实现AOP的4种方式

    了解AOP的相关术语:1.通知(Advice):通知定义了切面是什么以及何时使用.描述了切面要完成的工作和何时需要执行这个工作.2.连接点(Joinpoint):程序能够应用通知的一个“时机”,这些“ ...

  3. spring的AOP

    最近公司项目中需要添加一个日志记录功能,就是可以清楚的看到谁在什么时间做了什么事情,因为项目已经运行很长时间,这个最初没有开来进来,所以就用spring的面向切面编程来实现这个功能.在做的时候对spr ...

  4. Spring(五)AOP简述

    一.AOP简述 AOP全称是:aspect-oriented programming,它是面向切面编号的思想核心, AOP和OOP既面向对象的编程语言,不相冲突,它们是两个相辅相成的设计模式型 AOP ...

  5. Spring中AOP原理,源码学习笔记

    一.AOP(面向切面编程):通过预编译和运行期动态代理的方式在不改变代码的情况下给程序动态的添加一些功能.利用AOP可以对应用程序的各个部分进行隔离,在Spring中AOP主要用来分离业务逻辑和系统级 ...

  6. Spring之AOP面向切片

       一.理论基础: AOP(Aspectoriented programming)面向切片/服务的编程,在Spring中使用最多的是对事物的处理.而AOP这种思想在程序中很多地方可以使用的,比如说, ...

  7. 利用CGLib实现动态代理实现Spring的AOP

    当我们用Proxy 实现Spring的AOP的时候, 我们的代理类必须实现了委托类的接口才能实现. 而如果代理类没有实现委托类的接口怎么办? 那么我们就可以通过CGLib来实现 package cn. ...

  8. spring之aop概念和配置

    面向切面的一些概念: 简单说: 连接点就一些方法,在这些方法基础上需要额外的一些业务需求处理. 切入点就是方法所代表的功能点组合起来的功能需求. 通知就是那些额外的操作. 织入就是使用代理实现整个切入 ...

  9. Spring的AOP与代理

    spring 支持两种注入方式: setter/constructor 支持多种配置方式: xml/java5注解/java类配置 支持两种事务管理: 声明性/编程性 实际上上述方式只有一个就能保证系 ...

  10. Spring 实践 -AOP

    Spring 实践 标签: Java与设计模式 AOP引介 AOP(Aspect Oriented Programing)面向切面编程采用横向抽取机制,以取代传统的纵向继承体系的重复性代码(如性能监控 ...

随机推荐

  1. PyTorch神经网络集成技术

    PyTorch神经网络集成技术 create_python_neuropod 将任意python代码打包为一个neurood包. create_python_neuropod( neuropod_pa ...

  2. Charles下载及安装破解-自己编辑

    Charles下载地址 地址:https://www.charlesproxy.com/latest-release/download.do 2. Charles破解 破解地址:https://www ...

  3. 一枚通过参数污染绕过百度RASP的XSS

    日常工作过程中,偶然发现一个网站登录页面,在页面返回包中存在一个隐藏参数"mess",且该页面部署了百度RASP进行防护,本文介绍如何发现隐藏参数以及如何通过参数污染方式造成XSS ...

  4. Django(63)drf权限源码分析与自定义权限

    前言 上一篇我们分析了认证的源码,一个请求认证通过以后,第二步就是查看权限了,drf默认是允许所有用户访问 权限源码分析 源码入口:APIView.py文件下的initial方法下的check_per ...

  5. spring + spring mvc + tomcat 面试题(史上最全)

    文章很长,而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三 ...

  6. 你能说出多线程中sleep、yield、join的用法及sleep与wait区别?

    Object中的wait.notify.notifyAll,可以用于线程间的通信,核心原理为借助于监视器的入口集与等待集逻辑 通过这三个方法完成线程在指定锁(监视器)上的等待与唤醒,这三个方法是以锁( ...

  7. 【模拟8.01】string(线段树)

    因为题中只有a-z,所以区间中大量字母都是重复的,我们不妨利用桶的性质. 开一棵树,里面维护当前区间内的相同元素,若区间内元素不同,则为零 每次升序操作就先查询一遍区间,用桶将每个区间的a-z元素统计 ...

  8. 【模板】O(nlongn)求LIS

    合理运用单调性降低复杂度 平常用的都是O(n^2)的dp求LIS(最长不下降子序列)这里介绍O(nlogn)的算法 分析 对于可能出现的x<y<i且A[y]<A[x]<A[i] ...

  9. excel VBA根据单元格内的逗号把内容拆分行

    Sub test1()    Dim h    Dim j As Integer    j = 0  '用于辅助循环的进行,可以在拆分行获取下一个需要拆分单元格的行号    'Application. ...

  10. 温故知新,Blazor遇见大写人民币翻译机(ChineseYuanParser),践行WebAssembly SPA的实践之路

    背景 在之前<温故知新,.Net Core遇见Blazor(FluentUI),属于未来的SPA框架>中我们已经初步了解了Blazor的相关概念,并且根据官方的指引完成了<创建我的第 ...