AOP常用注解
1、@Aspect
- 配置切面Bean,和<bean.../>元素进行配置无区别,一样支持依赖注入来配置属性值;
- 如果启动了Spring的“零配置”特性,一样可以让Spring自动搜索,并加载指定路径下的切面Bean
- 使用@Aspect修饰的类(切面类)和其他类一样可以有方法、成员变量定义,还可能包括切入点、增强处理定义
- 使用@Aspect修饰类,Spring将不会把该Bean当成组件Bean处理,因此负责自动增强的后处理Bean将会略过该Bean,不会对该Bean进行任何增强处理
2、@Before
- 修饰一个方法时,该方法将作为Before增强处理
- 使用@Before修饰事,需要指定一个value属性值,该属性值指定一个切入点表达式(既可以是一个已有的切入点,也可以直接定义切入点表达式),用于指定该增强处理将被织入哪些切入点
- 表示在切入点执行前需要进行的操作或者需要执行的方法
3、@After
- 同Before
- 表示在切入点执行后,进行哪些操作
- 通常用于资源释放
4、@AfterReturning
- 同上
- 使用@AfterReturning增强处理可指定如下常用属性
- pointcut/value:用于指定该切入点对应的切入表达式,当指定了pointcut属性值后,value属性值将会被覆盖
- returning:该属性值指定一个形参名,用于表示Advuce方法中可以定义与此同名的形参,该形参可用于访问目标方法的返回值
- 在Advice方法中定义该形参时指定的类型,会限制目标方法必须返回指定类型的值或没有返回值
- AfterReturning增强处理只有在目标方法成功完成后才会被织入
- After增强处理不管目标方法时如何结束的(成功或抛出异常),它都会被织入
5、@AfterThrowing
- 同上
- 使用@AfterThrowing注解时可指定如下两个常用属性:
- pointcut/value:用于指定该切入点对应的切入表达式,当指定了pointcut属性值后,value属性值将会被覆盖
- throwing:该属性值指定一个形参名,用于表示Advice方法中可以定义与此同名的形参,该形参可用于访问目标方法抛出的异常
- 在Advice方法中定义该形参时指定的类型,会限制目标方法必须抛出指定类型的异常
6、@Around
- Around增强处理是功能比较强大的增强处理;
- 近似等于Before增强处理和AfterReturning增强处理的总和
- 既可以在执行目标方法之前织入增强动作,也可以在执行目标方法之后织入增强动作
- Around增强处理可以改变执行目标方法的参数值,也可以改变执行目标方法之后的返回值
- Around增强处理虽然功能强大,但通常需要在线程安全的环境下使用,所以一般用Before和AfterReturning增强处理能解决的问题,不建议用Around
- 如果需要目标方法执行之前和之后共享某种状态数据,则应该考虑使用Around增强处理;尤其是需要改变目标方法的返回值时,则只能使用Around增强处理了
- @Around增强处理事,需要指定一个value属性,该属性指定该增强处理被植入的切入点
- 当定义一个Around增强处理方法时,该方法的第一个形参必须是ProceedingJoinPoint类型(至少包含一个形参),在增强处理方法体内,调用ProceedingJoinPoint参数的proceed()方法才会执行目标方法——这就是Around增强处理可以完全控制目标方法的执行时机、如何执行的关键;如果程序没有调用ProceedingJoinPoint参数的proceed()方法,则目标方法不会被执行。
- 调用ProceedingJoinPoint参数的proceed()方法时,还可以传入一个Object[]对象作为参数,该数组中的值将被传入目标方法作为执行方法的实参
package com.sysker.aspect;
import java.util.Arrays;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class TxAspect {
@Around("execution(* com.sysker.impl.*.*(..))")
public Object changeValue(ProceedingJoinPoint jp) throws Throwable {
System.out.println("TxAspect执行目标方法之前,模拟开始事务。。。");
Object[] args = jp.getArgs();
if(args != null && args.length > 1) {
args[0] = "change00" + args[0];
}
Object rvt = jp.proceed(args);
System.out.println("TxAspect执行目标方法之后,模拟结束事务。。。");
if(rvt != null && rvt instanceof Integer) {
rvt = (Integer)rvt*(Integer)rvt;
}
System.out.println(rvt);
return rvt;
}
@Before("execution(* com.sysker.impl.*.*(..))")
public void authority(JoinPoint jp) {
System.out.println("TxAspect模拟执行权限检查");
System.out.println("Before增强:被织入增强处理的目标方法:" + jp.getSignature().getName());
System.out.println("Before增强:被织入增强处理的目标方法的参数:" + Arrays.toString(jp.getArgs()));
System.out.println("Before增强:被织入增强处理的目标对象为:" + jp.getTarget());
}
@After("execution(* com.sysker.impl.*.*(..))")
public void show() {
System.out.println("TxAspect模拟释放资源");
}
@AfterThrowing(throwing = "ex", pointcut = "execution(* com.sysker.impl.*.*(..))")
public void doRecoveryAciton(Throwable ex) {
System.out.println("目标抛出的异常:" + ex);
System.out.println("模拟Advice对异常进行修复");
}
}
AOP常用注解的更多相关文章
- Spring系列之Spring常用注解总结
传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点:1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文件 ...
- 利用spring AOP 和注解实现方法中查cache-我们到底能走多远系列(46)
主题:这份代码是开发中常见的代码,查询数据库某个主表的数据,为了提高性能,做一次缓存,每次调用时先拿缓存数据,有则直接返回,没有才向数据库查数据,降低数据库压力. public Merchant lo ...
- spring注解开发中常用注解以及简单配置
一.spring注解开发中常用注解以及简单配置 1.为什么要用注解开发:spring的核心是Ioc容器和Aop,对于传统的Ioc编程来说我们需要在spring的配置文件中邪大量的bean来向sprin ...
- Spring常用注解总结
转载自:https://www.cnblogs.com/xiaoxi/p/5935009.html 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点 ...
- Spring注解 系列之Spring常用注解总结
参考:Spring系列之Spring常用注解总结 (1) Resource 默认是byName的方式进行bean配置,@AutoWired默认是按照byType的方式进行装配bean的:(2)Comp ...
- spring(二、bean生命周期、用到的设计模式、常用注解)
spring(二.bean生命周期.用到的设计模式.常用注解) Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的. ...
- Spring系列之Spring常用注解总结 转载
Spring系列之Spring常用注解总结 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点:1.如果所有的内容都配置在.xml文件中,那么.x ...
- Spring的第四天AOP之注解版
Spring的第四天AOP之注解版 ssm框架 spring 在上一篇博客中,介绍了Spring的AOP的xml版本的使用,在这篇博客中,我将介绍一下,注解版的使用. 常用注解 注解 通知 @Aft ...
- Spring 中常用注解原理剖析
前言 Spring 框架核心组件之一是 IOC,IOC 则管理 Bean 的创建和 Bean 之间的依赖注入,对于 Bean 的创建可以通过在 XML 里面使用 <bean/> 标签来配置 ...
随机推荐
- Linux课程---7、shell技巧(获取帮助命令)
Linux课程---7.shell技巧(获取帮助命令) 一.总结 一句话总结: ls --help:简单手册 man ls:内容手册 1.tab补全? 命令+tab:加快敲命令敲文件目录的速度,多敲几 ...
- idea集成spring+spring MVC+mybatis问题
1.如果mybatis的xml文件放在java文件夹下(idea不会编译src的java目录的xml文件),需要在pom.xml中加入以下代码: <build> <resources ...
- Python-单元测试unittest
Python中有一个自带的单元测试框架是unittest模块,用它来做单元测试,它里面封装好了一些校验返回的结果方法和一些用例执行前的初始化操作,概念见下: TestCase 也就是测试用例 Test ...
- cocos2d-x CSV文件读取 (Excel生成csv文件)
实现类 CCSVParse.h #ifndef __C_CSV_PARSE__ #define __C_CSV_PARSE__ #include "cocos2d.h" #incl ...
- 【二叉查找树】01不同的二叉查找树的个数【Unique Binary Search Trees】
当数组为1,2,3,4,...,n时,基于以下原则构建的BST树具有唯一性: 以i为根节点的树,其左子树由[1,i-1]构成,其右子树由[i+1, n]构成. 我们假定f(i)为以[1,i]能产生的U ...
- bzoj 3280: 小R的烦恼 费用流
题目: Description 小R最近遇上了大麻烦,他的程序设计挂科了.于是他只好找程设老师求情.善良的程设老师答应不挂他,但是要求小R帮助他一起解决一个难题. 问题是这样的,程设老师最近要进行一项 ...
- bzoj 4771: 七彩树 树链的并+可持久化线段树
题目大意: 给定一颗树,询问树中某个点x的子树中与其距离不超过d的所有点中本质不同的颜色数 强制在线 题解: 一下午终于把这道题叉掉了. 写了三个算法,前两个都是错的,后一个是%的网上大爷们的题解. ...
- [Codeforces 204E] Little Elephant and Strings
[题目链接] https://codeforces.com/contest/204/problem/E [算法] 首先构建广义后缀自动机 对于自动机上的每个节点 , 维护一棵平衡树存储所有它所匹配的字 ...
- GCC泛型宏
在JAVA和CPP这种OOP语言中,都有泛型类,在C语言可以用宏定义实现泛型函数. main.c #include <stdio.h> #define min(x, y) ({ \ typ ...
- POJ(2186)强连通分量分解
#include<cstdio> #include<vector> #include<cstring> using namespace std; ; vector& ...