AOP: 面向切面编程
设置装备摆设文件的头信息
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
AOP的焦点组件:
切面(Aspect):切面是封装通用营业逻辑的组件,可以感化到其他组件上。
切入点(Pointcut): 用于指定哪些组件哪方式利用切面组件,Spring供应表达式来实现该制订。
通知(Advice):用于指定组件感化到目的组件的具体位置。
AOP前置通知:在目的组件的方式执行前执行的法式。
切入点法式:
packagemodel;public classChengxu {public voidtalk(String str){
System.out.println("str="+str);
}
}
切面法式:
packagemodel;importorg.aspectj.lang.JoinPoint;public classCharu {public voidlog(JoinPoint jp){
System.out.println("日记的方式");
System.out.println("获取目的函数参数体式格局:" +jp.getArgs()[0]);//获得切入点法式中方式的参数
System.out.println("获取目的对象:" +jp.getTarget().getClass().getName());//获得切入点程的 包名.类名System.out.println("获取目的函数的java反射对象:" +jp.getSignature());//获得切入点程的 返回类型 包名.类名.方式名()
System.out.println("执行前置通知");
}
}
Applicationcontext.xml省略文件头信息
AOP后置通知:在目的组件的方式正常执行并返回参数后执行的法式。
切入点法式:
packagemodel;public classChengxu {//此方式也可以没有返回值
publicString talk(String str){
System.out.println("str="+str);return "留存成功";
}
}
切面法式:
packagemodel;importorg.aspectj.lang.JoinPoint;public classCharu {public voidlog(JoinPoint jp,Object ret){//假如切入点方式没返回值,那么这个Object ret省略不写
System.out.println("后置");
System.out.println("obj为目的组件方式返回值:" +ret);
}
}
Applicationcontext.xml
异常通知:在目的组件的方式抛出异常信息后执行的法式。
注:当前置通知和后置通知发生异常时,这个异常通知是不执行的,只有当目的组件发生异常时才执行。
切面法式:
packagemodel;importorg.aspectj.lang.JoinPoint;public classCharu3 {public voidlog3(JoinPoint jp,Throwable t){
System.out.println("异常通知");
System.out.println("t为目的组件发生异常的信息:" +t);
}
}
切入点法式:
packagemodel;public classChengxu {//有返回值的方式
publicString talk(String str){
System.out.println("str="+str);
System.out.println(10/0);//发生异常的处所
return "留存成功";
}
}
Application.xml
最终通知:在目的组件的方式正常执行后执行,或在异常通知之前执行。
注:也就是当目的组件发生没发生异常,都邑被执行。
假如目的组件异常时,那后置通知不会执行,异常通知会执行。最终通知会在异常通知之前执行。
假如目的组件正常时,那最终通知会在后置通知之前执行。
Application.xml
环抱通知: 切面法式负责挪用目的组件的运行,与struts中的阻挡器功能雷同,可以完全庖代之前的几个通知。
切面法式:在类型为环抱通知的切面法式函数中,参数为org.aspectj.lang.ProceedingJoinPoint是JoinPoint的子类,扩展了JoinPoint类,供应了proceed()函数,该函数的感化是挪用目的组件,并返回目的组件返回的值。
Application.xml
切面法式:
public classCharu5 {public voidlog5(ProceedingJoinPoint pjp) {
System.out.println("前置通知");try{
Object ob= pjp.proceed();//挪用目的组件
System.out.println("目的函数的返回值:"+ob);
System.out.println("后置通知");
}catch(Throwable e) {
System.out.println("异常通知");
}
System.out.println("最终通知");
}
}
注释体式格局实现以上内容
XML中增添
@Aspect:代表切面法式
在切面类下添加下面代码实现各自的功能
前置通知:@Before(value="execution(* com.china.model.Chengxu.talk(*))")
后置通知:@AfterReturning(value="execution(*com.china.model.Chengxu.talk(*))",returning="ret")
异常通知:@AfterThrowing(value="execution(* com.china.model.Chengxu.talk(*))", throwing="e")
最终通知:@After(value="execution(* com.china.model.Chengxu.talk(*))")
环抱通知:@Around(value="execution(* com.china.model.Chengxu.talk(*))")