Spring aop
- 导入Spring aop基本jar包,使用的aspectj
- 配置文件引入命名空间,配置aop
- 把横切关注点的代码抽象到切面类中
①切面类是IOC容器的bean so加入 @Compnent 还要加入@Aspect
②在方法中声明通知 通知可写入表达式,
③可在方法中声明类型为JoinPoint的参数,然后就可以访问连接细节,如方法名和参数值。
通知代码
@Order(1) // 通过此注解来调整优先级,数越小,优先级越高
@Component
@Aspect
public class Notice {
//该方法声明一个前置通知,在方法开始之前执行
@Before("execution(public int com.springTest.Proxy.ICalculation.div(int,int))")
public void sayHelloBeforeMethod(JoinPoint joinPoint) {
System.out.println("Before " + joinPoint.getSignature().getName());
}
//后置通知:在目标方法执行后(无论是否发生异常),执行的通知。
//是在连接点完成之后执行的,即连接点返回结果或抛出 异常的时候,后置通知记录了方法的终止
//在后置通知中还不能访问目标方法执行的结果
@After("execution(public int com.springTest.Proxy.ICalculation.div(int,int))")
public void sayByeAfterMetnod(JoinPoint joinPoint) {
System.out.println("After " + joinPoint.getSignature().getName());
}
//方法正常结束受执行的代码
//返回通知是可以访问到返回值的
@AfterReturning(value = "execution(public int com.springTest.Proxy.ICalculation.div(int,int))", returning = "result")
public void afterReturning(JoinPoint joinPoint, Object result) {
System.out.println("AfterReturning :" + joinPoint.getSignature().getName() + ",result is" + result);
}
//异常通知
//可以访问异常对象
//Exception处可以指定异常的类型,只有出相应异常的时候才会出发方法
@AfterThrowing(value = "execution(public int com.springTest.Proxy.ICalculation.div(int,int))", throwing = "e")
public void afterThrowing(JoinPoint joinPoint, Exception e) {
String name = joinPoint.getSignature().getName();
System.out.println("AfterThrowing :" + name + ", Exception :" + e);
}
/**
* 环绕通知需要携带ProceedingJoinPoint 类型的参数
* 类似动态代理,ProceedingJoinPoint 类型的参数可以决定是否执行目标方法。
* 环绕通知必须有返回值,返回值即目标方法的返回值
*/
@Around(value = "execution(public int com.springTest.Proxy.ICalculation.div(int,int))")
public Object around(ProceedingJoinPoint proceedingJoinPoint) {
Object result = null;
try {
System.out.println("around 前置通知...");
result = proceedingJoinPoint.proceed();
System.out.println("around 返回通知... :" + result);
} catch (Throwable throwable) {
System.out.println("around 异常 :" + throwable);
// throw new RuntimeException(throwable);
}
System.out.println("around 后置通知...");
return result;
}
}
通过配置文件的方式配置aop
<!--配置 基本 bean-->
<bean id="calculation" class="com.springTest.aop.withXml.Calculation"></bean>
<bean id="notice" class="com.springTest.aop.withXml.Notice"></bean>
<!--aop 配置-->
<aop:config>
<!--配置切点及表达式-->
<aop:pointcut id="pointcut" expression="execution(* com.springTest.aop.withXml.ICalculation.*(int,int))"></aop:pointcut>
<aop:aspect ref="notice" order="2">
<aop:before method="sayHelloBeforeMethod" pointcut-ref="pointcut"></aop:before>
</aop:aspect>
</aop:config>