AspectJ--5中通知总结及其他注解使用

1 前置在上一篇

2后置

/**
	 * @AfterReturning:后置通知
	 *    属性: 
	 *     1.value 切入点表达式, 表示切面执行的位置
	 *     2.returning 自定义的变量,表示目标方法的返回值, 
	 *                 这个变量名称必须和通知方法的参数名一样。
	 *    位置:方法的上面
	 * 特点:
	 *  1.在目标方法之后执行的。
	 *  2.能够获取到目标方法的返回值。
	 *  3.不能影响目标方法的执行。
	 *  
	 * 参数
	 *   JoinPoint : 必须是参数列表的第一个
	 *  
	 *  Object result =  doOther();
	 *  myAfterReturning(result)
	 */
	@AfterReturning(value="execution(* *..SomeServiceImpl.doOther(..))",returning="result")
	public void myAfterReturning(JoinPoint jp,Object result){
		//修改目标方法的返回值
		if(result != null){
			String str = (String)result;
			result = str.toUpperCase();
		}
	    System.out.println("方法的定义:"+jp.getSignature());
		//切面的功能,事务处理
		System.out.println("后置通知:在目标方法之后执行,能够获取到目标方法的返回值:"+result);

3 环绕

/**
	 * @throws Throwable 
	 * @Around:环绕通知
	 *    属性: value 切入点表达式。 表示切面执行的位置
	 *    位置:在方法的定义的上面
	 * 特点:
	 *  1.在目标方法的前和后都能增强功能。
	 *  2.控制目标方法是否执行
	 *  3.能修改目标方法的执行结果。
	 * 
	 *  环绕通知方法的定义
	 *   1.必须有返回值, 表示目标方法的执行结果(可以是修改后的结果)
	 *   2.必须有参数ProceedingJoinPoint , 
	 *     它主要用来执行目标方法(jdk中的method.invoke(target, args);)
	 */
	@Around(value="execution(* *..SomeServiceImpl.doFirst(..))") 
	public Object myAround(ProceedingJoinPoint pjp) throws Throwable{
		Object obj = null;
		
		String uname = "";
		//获取目标方法执行时的参数
		Object args []=pjp.getArgs();
		if( args.length >1 ){
			Object arg = args[0];
			uname = (String)arg;
		}
		
		System.out.println("环绕通知:在目标方法之前,加入日志功能");
		
		if("lisi".equals(uname)){
			//执行目标方法,执行doFirst()
			obj  = pjp.proceed(); // doFirst() , method.invoke(target, args)
		}
		//修改目标方法的执行结果
		if(obj !=null){
			obj = "Hello Ok";
		}

		System.out.println("环绕通知:在目标方法之后,加入事务提交");
		//返回目标方法的执行结果
		return obj;
	}

4 异常

/**
	 * @AfterThrowing :异常通知
	 *    属性:
	 *     1.value 切入点表达式, 表示切面执行的位置
	 *     2.throwing 自定义的变量,表示目标方法抛出的异常对象, 必须和通知方法的参数名一样。
	 *                通过throwing能够获取到目标方法的异常信息
	 *    位置:
	 *     在方法的定义上面
	 * 特点
	 *  1.在目标方法抛出异常时执行的,没有异常不执行
	 *  2.不是异常处理程序, 它只是得到有异常发生。异常还是会被抛出的
	 *  
	 *  
	 *  try{
	 *      SomeServiceImpl.doSecond(..)
	 *  }catch(Exception exception){
	 *      myAfterThrowing(exception)
	 *  }
	 */
	@AfterThrowing(value="execution(* *..SomeServiceImpl.doSecond(..))",throwing="ex")
	public void myAfterThrowing(Throwable ex){
		// 记录异常发生的数据,记录异常的时间,发生的位置,原因等, 记录到数据库或者日志文件
		// 发送邮件,短信,把异常发生情况发送给开发人员。
		System.out.println("异常通知:在目标方法抛出异常时执行,异常的原因是:"+ex.getMessage());
	}

5 最终

/**
	 * @After:最终通知
	 *   属性  value  切入点表达式
	 *   位置 方法的上面
	 * 特点:
	 *  1.总是会被执行的。
	 *  2.在目标方法之后执行的
	 *  
	 * try{
	 *   SomeServiceImpl.doThird()
	 * }finally{
	 *   myAfter()
	 * }
	 */
	@After(value="execution(* *..SomeServiceImpl.doThird(..))")
	public void myAfter(){
		//做程序的收尾工作,比如内存是否,资源回收。
		System.out.println("最终通知,总是会被执行的");
	}

@Pointcut

	/**
	 * @After:最终通知
	 *   属性  value  切入点表达式
	 *   位置 方法的上面
	 * 特点:
	 *  1.总是会被执行的。
	 *  2.在目标方法之后执行的
	 *  
	 * try{
	 *   SomeServiceImpl.doThird()
	 * }finally{
	 *   myAfter()
	 * }
	 */
	@After(value="mypt()")
	public void myAfter(){
		//做程序的收尾工作,比如内存是否,资源回收。
		System.out.println("最终通知,总是会被执行的");
	}
	
	@Before(value="mypt()")
	public void myBefore(){
		System.out.println("前置通知,在目标方法之前执行的");
	}
	
	/**
	 * @Pointcut:定义和管理切入点。
	 *    属性  value 表示切入点表达式
	 *    位置 方法的上面
	 * 特点:
	 *   @Pointcut在一个方法的上面, 这个方法的名称就是切入点的别名。
	 *   在其他的通知方法中, value属性可以使用方法名称,表示切入点
	 *   
	 */
	@Pointcut(value="execution(* *..SomeServiceImpl.doThird(..))")
	private void mypt(){
		//无需代码
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值