AOP 面向切面编程,通过预编译的方式,在运行期通过动态代理实现一种技术,AOP可实现业务与切面的逻辑分离,降低耦合度

一、注解形式的AOP

  Aspect:切面

  Joinpoint:连接点,要拦截的方法

  Pointcut:切点,连接点的集合

  Advice:通知,在连接点前后,或异常情况来做的事情。  前置通知,后置通知,返回通知,异常通知,环绕通知

  Target:目标对象:代理的目标对象

  Weave:织入,切面应用到目标对象,并创建Proxy的过程

  1、导包:spring-aop   spring-aspect   aopalliance    weaver

  2、引入头信息:

xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation=“http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd"

  3、基于注解方式的切面声明

<!-- 开启以注解形式切面的驱动 -->
<aop:aspectj-autoproxy/>

  4、切面定义,创建一个类,上面加入@Aspect

 1 @Aspect
2 public class PermAspect {
3 /**
4 * 第一个* 返回值类型
5 * 第二个* 所有类
6 * 第三个* 所有方法
7 * 第一个.. 包及其子包
8 * 第二个.. 所有参数
9 */
10 @Pointcut("execution(* com.tx.spring..*.*(..))")
11 public void anyMethod(){
12
13 }
14 }

  5、前置通知

 1 /**
2 * 前置通知
3 * anyMethod() 前置通知的切点
4 * args中的参数名,要与方法名中的参数名一致
5 */
6 @Before(value="anyMethod()&&args(user)")
7 public void preAdvice(User user){
8 System.out.println(user);
9 user.setUsername("张三");
10 System.out.println("执行前置通知");
11 System.out.println("---------------------");
12 }

  6、后置通知

 1 /**
2 * 后置通知
3 * anyMethod() 前置通知的切点
4 * args中的参数名,要与方法名中的参数名一致
5 */
6 @After(value="anyMethod()&&args(user)")
7 public void afterAdvice(User user){
8 System.out.println("---------------------");
9 System.out.println("执行后置通知");
10 }

  7、返回通知

/**
* 返回通知,可以对业务方法的返回值进行统一加工
*/
@AfterReturning(value="anyMethod()",returning="user")
public void returnAdvice(User user){
System.out.println("------------");
user.setUsername("李四");
System.out.println("执行返回通知");
}

  8、例外通知

/**
* 例外通知
* @param ex 抛出的异常
*/
@AfterThrowing(pointcut="anyMethod()",throwing="ex")
public void exceptionAdvice(Exception ex){
System.out.println("执行例外通知");
ex.printStackTrace();
}

  9、环绕通知

/**
* 环绕通知
* @param jp 指定的连接点(要拦截的方法)
*/
@Around("anyMethod()")
public Object aroundAdvice(ProceedingJoinPoint jp){
Object[] argsArr = jp.getArgs();
System.out.println("环绕通知前-----参数是:"+argsArr[0]); Object obj = null;
try {
obj = jp.proceed();//执行要拦截的方法
} catch (Throwable e) {
e.printStackTrace();
}
System.out.println("环绕通知后-----");
return obj;
}

Spring 注解形式AOP的更多相关文章

  1. Spring注解(AOP)

    底层动态代理 程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式 导入aop的相关模块 <!-- https://mvnrepository.com/artifact/org. ...

  2. spring注解开发-AOP(含原理)

    一:AOP基本使用 AOP指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式: 步骤一:导入aop模块:Spring AOP:(spring-aspects) <depen ...

  3. spring注解、aop(二)

    使用注解配置spring 1.导入 spring-aop-5.0.6.RELEASE.jar包 2.为主配置文件引入新的命名空间 xmlns:context="http://www.spri ...

  4. spring注解实现AOP

    项目结构图

  5. spring 注解 之 AOP基于@Aspect的AOP配置

    Spring AOP面向切面编程,可以用来配置事务.做日志.权限验证.在用户请求时做一些处理等等.用@Aspect做一个切面,就可以直接实现. 1.首先定义一个切面类,加上@Component  @A ...

  6. Spring注解配置Aop

    之前学习了SpringAop的基本原理.http://www.cnblogs.com/expiator/p/7977975.html 现在尝试使用注解来配置SpringAop. Aop,面向切面编程. ...

  7. Spring注解式AOP面向切面编程.

    1.AOP指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式.aop底层是动态代理. package com.bie.config; import org.aspectj.lan ...

  8. Spring 注解式Aop 入门

    首先在spring配置文件中加上 xmlns:aop="http://www.springframework.org/schema/aop" http://www.springfr ...

  9. Spring注解开发系列专栏

    这个系列主要是讲Spring注解的使用,可以为后面SpringBoot的学习带来一定的帮助.我觉得从Spring直接过度到SpringBoot还是有点快,还是得需要一个演变的过程.从Spring开发, ...

随机推荐

  1. RabbitMQ系列随笔——介绍及安装

    一.RabbitMQ介绍 RabbitMQ是由erlang开发的AMQP(Advanced Message Queuing Protocol)的开源实现.他是高级消息队列协议,是应用层协议的一个开放标 ...

  2. 贝塞尔曲线(B-spline)的原理与应用

    什么是贝塞尔曲线? 贝塞尔曲线(Bézier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线. 来源 贝塞尔曲线于1962,由法国工程师皮埃尔·贝塞尔(Pierre Béz ...

  3. laravel发送邮件配置

    1.设置发送方,即邮件服务器,可以使用163邮箱,设置smtp,开启后获取授权码 2.在env文件配置 MAIL_DRIVER=smtpMAIL_HOST=smtp.163.com  //邮箱服务器M ...

  4. laravel+vue+vuetify 前端匹配不到数据记录 No matching records found

    后端数据:使用guzzle获取api数据,(安装扩展包guzzle) use GuzzleHttp\Client; //获取请求远程产品信息需要的参数public function getParams ...

  5. 虚拟机安装:VirtualBox上安装Ubuntu

    在Win10 中使用VirtualBox安装Ubuntu 本教程将指引读者在Windows10操作系统下使用开源虚拟机软件VirtualBox安装Ubuntu,读者也可以使用其他虚拟机VMware W ...

  6. 浅析一个lua文件窥slua工作机制

    slua的东西不是几句话能讲得完,这里只说结论不说原因,原因有空写个Little Slua工程来解释,下面注释中有几个关键点:LuaVar系列类:LuaFunction,LuaTable,LuaDel ...

  7. Flutter Toast消息提示框插件

    Flutter Toast消息提示框插件 在开发flutter项目中,想必大家肯定会用到toast消息提示,说到这里, 大家肯定会想到https://pub.dev/ 插件库, 但是插件市场上有太多类 ...

  8. C++中的输入输出

    update&fixed: 经过实测,io解绑在各大oj以及本地评测软件上都劣于scanf 所以在大数据的情况下还是推荐尽量使用scanf! ! ! ! 众所周知,C++自带了各种输入方式 比 ...

  9. 在Win10上安装Apache2.44

    下载地址:https://www.apachelounge.com/download/VS16/binaries/httpd-2.4.41-win64-VS16.zip 如果以上地址失效请到 http ...

  10. 面试官问我:看过sharding-jdbc的源码吗?我吧啦吧啦说了一通!!

    写在前面 在产品初期快速迭代的过程中,往往为了快速上线而占据市场,在后端开发的过程中往往不会过多的考虑分布式和微服务,往往会将后端服务做成一个单体应用,而数据库也是一样,最初会把所有的业务数据都放到一 ...