Spring AOP基础
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基础的更多相关文章
- [Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.
前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习 ...
- [Spring框架]Spring AOP基础入门总结一.
前言:前面已经有两篇文章讲了Spring IOC/DI 以及 使用xml和注解两种方法开发的案例, 下面就来梳理一下Spring的另一核心AOP. 一, 什么是AOP 在软件业,AOP为Aspect ...
- CgLib动态代理学习【Spring AOP基础之一】
如果不了解JDK中proxy动态代理机制的可以先查看上篇文章的内容:Java动态代理学习[Spring AOP基础之一] 由于Java动态代理Proxy.newProxyInstance()的时候会发 ...
- 【AOP】Spring AOP基础 + 实践 完整记录
Spring AOP的基础概念 ============================================================= AOP(Aspect-Oriented Pr ...
- Spring AOP基础知识
Spring AOP使用动态代理技术在运行期织入增强的代码,两种代理机制包括:一是基于JDK的动态代理,另一种是基于CGLib的动态代理.之所以需要两种代理机制,很大程度上是因为JDK本身只提供接口的 ...
- Java动态代理学习【Spring AOP基础之一】
Spring AOP使用的其中一个底层技术就是Java的动态代理技术.Java的动态代理技术主要围绕两个类进行的 java.lang.reflect.InvocationHandler java.la ...
- Spring AOP基础概念及自定义注解式AOP初体验
对AOP的理解开始是抽象的,看到切点的匹配方式其实与正则表达式性质大致一样就基本了解AOP是基本是个什么作用了.只是整个概念更抽象,需要具化理解.下图列表是AOP相关概念解释,可能也比较抽象^_^ 比 ...
- Spring Aop基础总结
什么是AOP: Aop技术是Spring核心特性之中的一个,定义一个切面.切面上包括一些附加的业务逻辑代码.在程序运行的过程中找到一个切点,把切面放置在此处,程序运行到此处时候会运行切面上的代码.这就 ...
- Spring AOP小记
一.概述 在通常的开发过程中,我们调用的顺序通常是controller->service-dao,其中,service中包含着太多的业务逻辑,并且还要不断调用dao来实现自身的业务逻辑,经常会导 ...
随机推荐
- 20155239《Java程序设计》实验二(面向对象程序设计)实验报告
实验内容 初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5.了解设计模式 实验步骤 单元测试 1.三种代码: 伪代码 ...
- BZOJ2140_稳定婚姻_KEY
题目传送门 暴力直接对于每个点跑一遍二分图匹配,能拿四十分. 然而我们考虑正解. 对于一对Couple我们建♂->♀的一条边,对于一对曾经有恋情的情侣我们建♀->♂的一条边. 跑Tarja ...
- C#之#if #endif的简单用法
有时候我们看到别人的代码中有#if #endif,其实这是通过不同版本来选择运行哪段代码,和咱们的if,else是一样的.下面看下简单的用法 #if DEBUG txt_display.Text = ...
- XAF-如何改变列表点击时的默认行为
在 Windows 窗体应用程序中,按下回车或双击列表会打开默认的详细视图. 在 ASP.NET Web 应用程序中,单击对象时执行此操作. 这一行为是由 ListViewProcessCurrent ...
- python进程-进阶
进程同步(multiprocessing.Lock(锁机制).multiprocessing.Semaphore(信号量机制).multiprocessing.Event(事件机制)) 在计算机中,有 ...
- scrapy 爬取知乎问题、答案 ,并异步写入数据库(mysql)
python版本 python2.7 爬取知乎流程: 一 .分析 在访问知乎首页的时候(https://www.zhihu.com),在没有登录的情况下,会进行重定向到(https://www. ...
- HTTP 两种基本请求方法 GET和 POST的区别
GET方法 1.GET交互方式是从服务器上获取数据,而并非修改数据,所以GET交互方式是安全的.就像数据库查询一样,从数据库查询数据,并不会影响数据库的数据信息,对数据库来说,也就是安全的.2.GET ...
- vue 跳转到外部 后回跳
微信 vue 跳转到外部 后回跳 ,比如登陆 授权操作 .需要 路由 先跳转到一个中间页面 后再跳转到授权服务器!而不能跳转前的页面与回跳后的页面相同 不然回跳可能会出现空白 路由不解析.
- hive的简单使用
一.一些说明 1.支持的操作 hive 默认不支持updata 和 delete操作 insert也是执行缓慢,主要用于数据的计算 hive 数据类型---字符串,大部分与java一致. 2.内外表的 ...
- 高可用Kubernetes集群-3. etcd高可用集群
五.部署高可用etcd集群 etcd是key-value存储(同zookeeper),在整个kubernetes集群中处于中心数据库地位,以集群的方式部署,可有效避免单点故障. 这里采用静态配置的方式 ...