1.写SomeService接口和SomeServiceImpl类
package com.bjpowernode.ba04;
public interface SomeService {
void doSome(String name,Integer age);
String doOther(String name,Integer age);
String doFirst(String name,Integer age);
void doSecond();
}
package com.bjpowernode.ba04;
//目标类
public class SomeServiceImpl implements SomeService {
@Override
public void doSome(String name,Integer age) {
//给doSome方法增加一个功能,在doSome()执行之前,输出方法执行的时间
System.out.println("====目标方法doSome()执行====");
}
@Override
public String doOther(String name, Integer age) {
System.out.println("====目标方法doOther()执行====");
return "abcd";
}
@Override
public String doFirst(String name, Integer age) {
System.out.println("====业务方法doFirst()执行====");
return "doFirst";
}
@Override
public void doSecond() {
System.out.println("====业务方法doSecond()执行====" + (10/0));
}
}
2.写切面类
package com.bjpowernode.ba04;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import java.util.Date;
/**
* @Aspect : 是aspectj框架中的注解。
* 作用:表示当前类是切面类。
* 切面类:是用来给业务方法增加功能的类,在这个类中有切面的功能代码
* 位置:在类定义的上面
*/
@Aspect
public class MyAspect {
/**
* 异常通知方法的定义格式
* 1.public
* 2.没有返回值
* 3.方法名称自定义
* 4.方法有个一个Exception, 如果还有是JoinPoint,
*/
/**
* @AfterThrowing:异常通知
* 属性:1. value 切入点表达式
* 2. throwinng 自定义的变量,表示目标方法抛出的异常对象。
* 变量名必须和方法的参数名一样
* 特点:
* 1. 在目标方法抛出异常时执行的
* 2. 可以做异常的监控程序, 监控目标方法执行时是不是有异常。
* 如果有异常,可以发送邮件,短信进行通知
*
* 执行就是:
* try{
* SomeServiceImpl.doSecond(..)
* }catch(Exception e){
* myAfterThrowing(e);
* }
*/
@AfterThrowing(value = "execution(* *..SomeServiceImpl.doSecond(..))", throwing = "exception")
public void myAfterThrowing(Exception exception){
System.out.println("异常通知:方法发生异常时,执行:"+exception.getMessage());
//发送邮件,短信,通知开发人员
}
}
3.测试