AOP基本术语

Advice-通知

Before

前置通知,目标方法被调用前调用

After

后置通知,目标方法完成后调用通知,并不关心方法的输出是什么

After-returning

目标方法成功执行后调用

After-throwing

目标方法抛出异常后调用

Around

通知包裹了被通知的方法,在被通知的方法调用前和调用后执行自定义行为

Pointcut-切点

定义哪些方法是需要被通知的

Aspect-切面

Advice+Pointcut=Aspect

Join Point-连接点

应用执行过程中能够插入切面的时间点

如:抛出异常时、调用方法时......

Introduction-引入

向现有类添加新的方法或属性

Weaving-织入

把切面应用到目标对象并创建新的代理对象

切点详解

Spring的AOP中,使用AspectJ切点表达式来定义切点

Spring仅支持AspectJ切点指示器的一个子集

arg()

指定方法的参数类型

@args()

指定方法的参数由指定注解标注

execution()

指定方法,方法由切点表达式描述 (* 包名.类名.方法名(参数))

  • 表示返回任意类型

    参数如果是 .. ,表示任意参数

within()

指定方法类型

@within()

指定方法的注解类型

@annotation()

指定方法带有指定注解

其他

bean()

bean("beanId")-在指定bean中生效

!bean("beanId")-在指定bean中不生效

切点之间可以使用 &&、||、!连接,如果在xml中描述,使用 and、or、not

定义切面

package com.zln.aop;
import org.aspectj.lang.annotation.*;
/**
* 定义切面
* Created by sherry on 17/3/9.
*/
@Aspect
public class Audience {
/**
* 切点
*/
@Pointcut("execution(* com.zln.aop.Performance.*(..))")
public void performance(){}
/**
* 前置通知
*/
@Before("performance()")
public void silenceCellPhones(){
System.out.println("前置通知:表演前手机静音");
}
@Before("performance()")
public void takeSeats(){
System.out.println("前置通知:就坐");
}
@AfterReturning("performance()")
public void applause(){
System.out.println("返回通知:表演结束,鼓掌");
}
@AfterThrowing("performance()")
public void demandRefund(){
System.out.println("异常通知:表演失败");
}
}
package com;
import com.zln.aop.Audience;
import org.springframework.context.annotation.*;
/**
* Created by sherry on 17/3/9.
*/
@Configuration
@EnableAspectJAutoProxy
@ComponentScan
public class AppBeans {
@Bean
public Audience audience(){
return new Audience();
}
}

运行测试

package com.zln.aop;
import org.springframework.stereotype.Component;
/**
* Created by sherry on 17/3/9.
*/
@Component
public class Performance{
public void perform() {
System.out.println("正在表演");
}
}

环绕通知

package com.zln.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
/**
* 定义切面
* Created by sherry on 17/3/9.
*/
@Aspect
public class Audience {
/**
* 切点
*/
@Pointcut("execution(* com.zln.aop.Performance.*(..))")
public void performance(){}
/**
* 前置通知
*/
@Before("performance()")
public void silenceCellPhones(){
System.out.println("前置通知:表演前手机静音");
}
@Before("performance()")
public void takeSeats(){
System.out.println("前置通知:就坐");
}
@AfterReturning("performance()")
public void applause(){
System.out.println("返回通知:表演结束,鼓掌");
}
@AfterThrowing("performance()")
public void demandRefund(){
System.out.println("异常通知:表演失败");
}
@Around("performance()")
public void watch(ProceedingJoinPoint proceedingJoinPoint){
System.out.println("环绕通知1");
try {
proceedingJoinPoint.proceed();
System.out.println("环绕通知2");
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}

环绕通知的proceedingJoinPoint.proceed();比较神奇,如果没有这句,相当于代码阻塞,如果调用多次,相当于执行多次目标方法

通知的方法参数

package com.zln.aop;
import org.springframework.stereotype.Component;
/**
* Created by sherry on 17/3/9.
*/
@Component
public class Performance{
public void perform(int i) {
System.out.println("正在表演");
}
}
    //如果不是int等基本类型,要使用类的全限定名
@Pointcut("execution(* com.zln.aop.Performance.*(int))")
public void performance(){}
/**
* 前置通知
*/
@Before("performance()&&args(i)")
public void silenceCellPhones(int i){
System.out.println("前置通知:表演前手机静音"+i);
}

调用perform方法的时候,参数i的值就会被获取到

Spring AOP基础的更多相关文章

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

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

  2. [Spring框架]Spring AOP基础入门总结一.

    前言:前面已经有两篇文章讲了Spring IOC/DI 以及 使用xml和注解两种方法开发的案例, 下面就来梳理一下Spring的另一核心AOP. 一, 什么是AOP 在软件业,AOP为Aspect ...

  3. CgLib动态代理学习【Spring AOP基础之一】

    如果不了解JDK中proxy动态代理机制的可以先查看上篇文章的内容:Java动态代理学习[Spring AOP基础之一] 由于Java动态代理Proxy.newProxyInstance()的时候会发 ...

  4. 【AOP】Spring AOP基础 + 实践 完整记录

    Spring AOP的基础概念 ============================================================= AOP(Aspect-Oriented Pr ...

  5. Spring AOP基础知识

    Spring AOP使用动态代理技术在运行期织入增强的代码,两种代理机制包括:一是基于JDK的动态代理,另一种是基于CGLib的动态代理.之所以需要两种代理机制,很大程度上是因为JDK本身只提供接口的 ...

  6. Java动态代理学习【Spring AOP基础之一】

    Spring AOP使用的其中一个底层技术就是Java的动态代理技术.Java的动态代理技术主要围绕两个类进行的 java.lang.reflect.InvocationHandler java.la ...

  7. Spring AOP基础概念及自定义注解式AOP初体验

    对AOP的理解开始是抽象的,看到切点的匹配方式其实与正则表达式性质大致一样就基本了解AOP是基本是个什么作用了.只是整个概念更抽象,需要具化理解.下图列表是AOP相关概念解释,可能也比较抽象^_^ 比 ...

  8. Spring Aop基础总结

    什么是AOP: Aop技术是Spring核心特性之中的一个,定义一个切面.切面上包括一些附加的业务逻辑代码.在程序运行的过程中找到一个切点,把切面放置在此处,程序运行到此处时候会运行切面上的代码.这就 ...

  9. Spring AOP小记

    一.概述 在通常的开发过程中,我们调用的顺序通常是controller->service-dao,其中,service中包含着太多的业务逻辑,并且还要不断调用dao来实现自身的业务逻辑,经常会导 ...

随机推荐

  1. 20155332 2006-2007-2 《Java程序设计》第3周学习总结

    学号 2006-2007-2 <Java程序设计>第3周学习总结 教材学习内容总结 尽量简单的总结一下本周学习内容 尽量不要抄书,浪费时间 看懂就过,看不懂,学习有心得的记一下 教材学习中 ...

  2. 20155338 2016-2017-2 《Java程序设计》第10周学习总结

    20155338 2016-2017-2 <Java程序设计>第10周学习总结 教材学习内容总结 网络编程 · 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事 ...

  3. CF 1083 B. The Fair Nut and Strings

    B. The Fair Nut and Strings 题目链接 题意: 在给定的字符串a和字符串b中找到最多k个字符串,使得不同的前缀字符串的数量最多. 分析:  建出trie树,给定的两个字符串就 ...

  4. js Date对象要注意的问题(时间转换)

    1.时间戳和时间对象可以灵活转变: let n = new Date() // 返回的是当前时间对应的国际时间 let nt =n.getTime() let n2 =new Date(nt) con ...

  5. HttpClient使用详解 (一)

    Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且 ...

  6. 180718-jar包执行传参使用小结

    jar包执行时传参的使用姿势 虽说我们现在大多不太直接使用jar包运行方式,目前比较主流的是将自己的服务丢在某个容器中(如tomcat,jetty等)运行,比如我之前所属的电商公司,就是将项目打包为w ...

  7. VirtualBox虚拟机上安装windows7系统

    1.下载Windows7的镜像文件 http://www.xitongcheng.com/jiaocheng/win7_article_24156.html 2.在虚拟机上安装Windows7 htt ...

  8. 获取json键值对的对应字符串

    获取json中的姓名 json串ac 关键字key public class Json { public static String json(String  key;String  ac) { JS ...

  9. Jenkins+git+Nginx

    1.Jenkins 一.tomcat安装 1.下载JDK和Tomcat //通过wget下载 wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomca ...

  10. JY播放器【QQ音乐破解下载】

    今天给大家带来一款神器----JY播放器.可以直接下载QQ音乐的歌曲. 目前已经支持平台(蜻蜓FM.喜马拉雅FM.网易云音乐.QQ音乐) 使用方法: 在网页打开QQ音乐网站找到你要听的歌曲或歌单.复制 ...