在现在的开发中使用这种方案比较多.
在spring2.0以后它支持jdk1.5注解,而整合aspectj后可以使用aspectj语法,可以简化开发。
Aspect:切面 =切点+通知(多个切点与多个通知的组合)
AspectJ 它是一个第三方框架,spring从2.0后可以使用aspectJ框架的部分语法.
AspectJ框架它定义的通知类型有6种
package com.itcast.aspectj;
public interface IUserService {
public void add();
public void update();
public void del();
public void search();
}
实现类
package com.itcast.aspectj;
public class IUserServiceImpl implements IUserService {
@Override
public void add() {
System.out.println(0/0);
System.out.println("aspectj IUserService add");
}
@Override
public void update() {
System.out.println("aspectj IUserService update");
}
@Override
public void del() {
System.out.println(0/0);
System.out.println("aspectj IUserService del");
}
@Override
public void search() {
System.out.println("aspectj IUserService search");
}
}
第二步:创建通知(增强 advice)
注意:在aspectj中它的增强可以不实现任何接口,只需要定义出增强功能(方法)
package com.itcast.aspectj;
import org.aspectj.lang.ProceedingJoinPoint;
//advice通知
public class IUserServiceHapper {
public void before(){
System.out.println("前置通知。。。");
}
public void before1(){
System.out.println("前置通知1。。。");
}
public void afterReturning(){
System.out.println("后置通知。。。");
}
public Object around(ProceedingJoinPoint point) throws Throwable {
System.out.println("环绕前。。。");
Object value = point.proceed();//执行目标行为
System.out.println("环绕后。。。");
return value;
}
public void afterThorwing(){
System.out.println("异常通知");
}
public void after(){
System.out.println("最终通知。。。");
}
}
第三步:在spring的xml 配置文件中来配置
aop:config下的aop:aspect是aspectJ框架用来声明切面的。
也可把切点抽取出来做成公共的,各通知可进行引用,可设置多个< aop:pointcut>
修改如下:
关于通知上的参数
public void before(JoinPoint jp){
System.out.println("拦截的目标类:"+jp.getSignature().getDeclaringTypeName());
System.out.println("拦截的方法名称:"+jp.getSignature().getName());
System.out.println("前置通知");
}
使用前置通知可以完成日志记录,权限控制
public void afterReturning(JoinPoint jp,Object val){
System.out.println("返回val。。。");
System.out.println("后置通知。。。");
}
第二个参数val它可以获取目标方法的返回值
注意:需要在配置文件中配置
public Object around(ProceedingJoinPoint pjp) throws Throwable {
//它是我们开发中应用最多的,可以完成日志操作,权限操作,性能监控,事务管理
System.out.println("环绕前。。。");
Object value = pjp.proceed();//执行目标行为
System.out.println("环绕后。。。");
return value;
}
它是我们开发中应用最多的,可以完成日志操作,权限操作,性能监控,事务管理
4.抛出异常通知上的参数
public void afterThorwing(JoinPoint jp,Throwable throwable){
//第二个参数Throwable它是用于接收抛出的异常,注意:需要在配置文件中声明
System.out.println("异常通知");
}
第二个参数Throwable它是用于接收抛出的异常
注意:需要在配置文件中声明
public void after(JoinPoint joinPoint){
//可以使用最终通知完成资源释放
System.out.println("最终通知。。。");
}
可以使用最终通知完成资源释放