使用AspectJ框架实现AOP
除jar包外资源文件配置
<!-- 使用组件扫描器扫描 -->
<context:component-scan base-package="cn.lexed.service"/>
<!-- 声明切面类对象 -->
<bean class="cn.lexed.aop.MyAspectJ"/>
<!-- 配置 AspectJ的代理机制 -->
<aop:aspectj-autoproxy/>
@Pointcut定义切入
/* @Pointcut:定义和管理切入点,如果你项目里有多个切入点表达式重复的,可以这样使用
* value:切入点表达式
*
* 特点:定义在方法上,此方法的方法名就是切入点表达式的别名
* */
/*定义方法,:
* 1.public
* 2.方法没有返回值
* 3.方法名自定义
* 4.方法可以有参数,也可以没有参数
* 如果有参数,参数不是自定义的(参数不能瞎写),有几个参数类型
*
*
* */
JoinPoint
/*
* 指定通知方法中的参数:JoinPoint
* 作用:可以在通知方法中获取方法执行时的信息,例如方法名称方法的实参等
* 如果说你需要用到方法里的信息,就加入JoinPoint
* 这个JoinPoint参数的值由框架赋予的,必须是第一个位置的参数
**/
@Pointcut(value="execution(* cn.lexed.service..*(..))")
public void mypt(){
//无需代码
}
/*@Before:前置通知注解
* 属性:value
* 位置:在方法上面
*
* 特点:
* 1.在核心方法之前先执行
* 2.不会改变核心方法执行的结果
* 3.不会影响核心方法的执行
*
* */
/*@Before(value="execution(* cn.lexed.service..*(..))")
public void myBefore(){
System.out.println("在业务方法之前进行日志输出显示");
}*/
/*
* @AfterReturning:后置通知
* value: 属性值就是切入点表达式
* returning:自定义的变量,表示目标方法的返回值
* 自定义的变量和通知方法的形参名一致
* 特点:1.在目标方法之后执行
* 2.能够获取到目标方法的返回值,根据这个返回值做不同的处理
* */
@AfterReturning(value="mypt()",returning="res")
public void myAfterRe(JoinPoint jp,Object res){
System.out.println(res);
if(res.equals("abcd")){
//写一些功能
}else{
//写一些功能
}
System.out.println("在业务方法之后进行事务相关的处理");
}
/* 1.环绕通知方法的定义格式:
* 1.public
* 2.必须有一个返回值 ,推荐使用Object
* 3.方法名自定义
* 4.方法有参数,固定的参数 ProceedingJoinPoint
*
*
*
* */
/*@Around(value="execution(* cn.lexed.service..*(..))")
public Object myAround(ProceedingJoinPoint pjp) throws Throwable{
Object o=null;
System.out.println("在业务方法之前进行日志输出显示");
pjp.proceed();//doFrist
System.out.println("在业务方法之后进行事务相关的处理");
return o;
}*/
/* 异常通知方法的定义格式:
* 1.public
* 2.没有返回值
* 3.方法名自定义
* 4.方法中有一个Exception
*
* @AfterThrowing:异常通知
* 属性: value:
* throwing:表示目标方法抛出的异常对象 ,名称和方法参数名一致
* */
/*@AfterThrowing(value="execution(* cn.lexed.service..*(..))",throwing="ex")
public void myThrow(Exception ex){
System.out.println("异常通知:方法发送异常时,执行:"+ex.getMessage());
//发送邮件,短信,通知开发人员
}*/