spring AOP切面,注解实现,获取参数

Spring的AOP有两种实现方式,一是通过xml配置,二是通过注解,为减少代码量提高可读性跟代码入侵本,若项目使用了spring的框架,本人首选的都是用注解去开发,方法很简单,只需要三步就可以搞定切面


一:在xml文件中开始注解

 
  

	

二:定义切面类,加上注解

/**
 * 用户操作记录日志 切面控制层
 * Created by longzhiqinag on 2017/3/29.
 */
@Aspect
@Component
public class UserOperateLogHandler{

}



三:在切面类上指定要进行AOP切面的方法

    @Before("execution(* com.tangcy.npcmeeting.controller.MeetingController.deleteBigMeeting(..))")
    public void deleteBigMeeting_Before(JoinPoint joinPoint){
        System.out.println("这里是目标方法执行前先执行");
    }
    @AfterReturning(returning = "entity",value = "execution(* com.tangcy.npcmeeting.controller.MeetingController.deleteBigMeeting(..))")
    public void deleteBigMeeting_After(JoinPoint joinPoint,Object entity){
        System.out.println("这里是目标方法执行完并成功返回结果 正常结束后才执行");
        System.out.println("方法的返回结果为"+entity);
        System.out.println("目标方法内的参数为"+ Arrays.asList(joinPoint.getArgs()));
    }
    @AfterThrowing(throwing = "e",value = "execution(* com.tangcy.npcmeeting.controller.MeetingController.deleteBigMeeting(..))")
    public void deleteBigMeeting_Throw(Throwable  e){
        System.out.println("这里是目标方法抛出异常后才执行");
        System.out.println("异常信息为"+e);
    }



用大白话说
  1. 由@Before注解定义的方法会在 execution() 表达式内的方法被调用之前执行
  2. 由@After注解定义的方法会在 execution()表达式内的方法被调用之后执行,无论方法执行成功与否
  3. 由@AfterReturning注解定义的方法会在 execution()表达式内的方法被调用之后并成功返回结果后执行,若抛出异常AfterReturning不会执行
  4. 由@AfterThrowing注解定义的方法会在 execution()表达式内的方法抛出异常后执行
  5. 由@Around注解定义的方法包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为
execution表达式
如:@AfterReturning("execution(* com.tangcy.npcmeeting.controller.OperateController.save(..))")
* 代表匹配方法的所有修饰符和所有返回值,经测式,方法修饰符若为private则不行,会出错 500,这里也可以这样写
@AfterReturning("execution(public void com.tangcy.npcmeeting.controller.OperateController.save(..))")
在 * 的位置换成你的方法修饰符跟返回值类型即可
.. 代表匹配方法的所有参数,无论该方法有多少个参数,是什么类型都匹配,若你的方法行参类型为String 也可以这样写
在..的地方换成你的参数类型即可,可写多个参数类型
@AfterReturning("execution(* com.tangcy.npcmeeting.controller.OperateController.save(String))")
com.tangcy.npcmeeting.controller 为方法的包路径/名

在你自定义的方法上加上 JoinPoint做为参数 可以获取将被切面方法的参数 注意是 
org.aspectj.lang.JoinPoint;这个包下的JoinPoint,返回值类型为Object[],需自已转换类型
如以下为自定义的方法 
@AfterReturning("execution(public void com.tangcy.npcmeeting.controller.OperateController.save(..))")
public void save_After(JoinPoint joinPoint){
	Object[] obj = joinPoint.getArgs();
	//将obj强转为你的参数类型再进行对应的操作
}
所有的注解通知用法都一样,这里只是用@AfterReturning来举例说明
很简单吧...


你可能感兴趣的:(spring-mvc)