1.首先要添加jar包
2.写方法接口
public interface calculate {
int add(int i, int j);
int sub(int i, int j);
int mul(int i, int j);
int div(int i, int j);
}
3.写方法的实现类,并把其加入到IOC容器中去
@Component
public class calculateImpl implements calculate {
public int add(int i, int j) {
return i+j;
}
public int sub(int i, int j) {
return i-j;
}
public int mul(int i , int j) {
return i*j;
}
public int div(int i,int j) {
return i/j;
}
}
4.写切面,首先要把这个类加入到IOC容器中去,其次利用@Aspect声明它为切面。
定义所想执行的方法,在calculateImpl方法实现的相应位置加上通知。
在同一个连接点上应用不止一个切面时, 除非明确指定, 否则它们的优先级是不确定的,这时候可利用@Order()注解来设置优先级,数字越小,优先级越高。
@Before: 前置通知, 在方法执行之前执行
@After: 后置通知, 在方法执行之后执行
@AfterRunning: 返回通知, 在方法返回结果之后执行
@AfterThrowing: 异常通知, 在方法抛出异常之后
@Around: 环绕通知, 围绕着方法执行
@Component
@Aspect
public class SimpleAspect {
/*
* @Pointcut声明切入点表达式。
* 定义一个方法,方法中一般不需要写代码
*/
@Pointcut("execution(* com.zxw.spring.bean.aop.*.*(int,int))")
public void pointCut() {
}
@Before("pointCut()")
public void before(JoinPoint joinPoint) {
//如果需要这里可以通过JoinPoint取出参数进行处理
//通过joinpoin获取签名的方法获取方法名
String methoName = joinPoint.getSignature().getName();
//获取要传入的参数
List<Object> args = Arrays.asList(joinPoint.getArgs());
System.out.println(methoName+"哈哈,方法执行前!"+args);
}
//在后置通知中还不能访问返回的结果
@After("pointCut()")
public void after(JoinPoint joinPoint) {
//通过joinpoin获取签名的方法获取方法名
String methoName = joinPoint.getSignature().getName();
//获取要传入的参数
List<Object> args = Arrays.asList(joinPoint.getArgs());
System.out.println(methoName+"哈哈,方法执行后!"+args);
}
//在返回通知中能访问返回的结果。在返回通知中, 只要将 returning 属性添加到 @AfterReturning 注解中, 就可以访问连接点的返回值. 该属性的值即为用来传入返回值的参数名称. 必须在通知方法的签名中添加一个同名参数. 在运行时, Spring AOP 会通过这个参数传递返回值.
@AfterReturning(value = "pointCut()", returning = "result")
public void afterReturning(JoinPoint joinPoint, Object result) {
System.out.println("返回值--> "
+ result);
}
//在出现制定异常的时候可以执行相应的代码
@AfterThrowing(value = "pointCut()", throwing = "error")
public void afterThrowing(JoinPoint jp, Throwable error) {
System.out.println("error:" + error);
}
/*
* 环绕通知是所有通知类型中功能最为强大的, 能够全面地控制连接点. 甚至可以控制是否执行连接点
* 环绕通知需要携带ProceedingJoinPoint类型的参数
* ProceedingJoinPoint类型的参数可以决定是否执行该方法
* 环绕通知必须有返回值,返回值为目标方法的返回值, 否则会出现空指针异常
*/
@Around("pointCut()")
public Object around(ProceedingJoinPoint pjp) {
Object result = null;
String methoName = pjp.getSignature().getName();
try {
//前置通知
System.out.println(methoName+"around begin");
//执行目标方法
result = pjp.proceed();
//后置返回通知
System.out.println("around返回值--> "+ result);
} catch (Throwable ex) {
//异常通知
System.out.println("around出错了!");
}
//后置通知
System.out.println(methoName+"around end");
return result;
}
}
5.在配置文件中进行设置,并加入aop的命名空间Namespaces
<!-- 配置自动扫描的包 -->
<context:component-scan base-package="com.zxw.spring.bean.aop"/>
<!-- 使AspjectJ注解起作用:自动为匹配的类生成代理对象 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>