spring中的aop拦截可以想象成类似struts2中的interceptor拦截。相关的定义网上很多,这里就不一一介绍了。
首先要在application.xml中配置 <aop:aspectj-autoproxy />
然后在相关实体类中中进行代码实现
@Aspect // 该注解用于定义该类是切面
@Component // 通知spring,注册实例化对象
public class Interceptor {
/*
* 第一个* 表示式返回类型, * 表示所有类型
* 第一个.. 表示该包以及所有子包
* 第二个 * 表示类名
* 第三个* 表示方法
* (..)方法中的参数
* */
//@Pointcut("execution(* cn.clq.service.impl..*.*(..))");
// 对PersonServiceBean所有方法进行拦截
@Pointcut("execution(* cn.itcast.service.impl.PersonServiceBean.*(..))")
private void anyMethod(){} // 申明一个切入点
/*前置通知 连接到方法(anyMethod)前,先执行doAccessCheck方法
* 如果加了 && args(name) 表示只能截取到只有一个参数,且参数类型与name一样的方法
* @Before("anyMethod() && args(name)")
* public void doAccessCheck(String name){}
* */
@Before("anyMethod()")
public void doAccessCheck(){
System.out.println("前置通知");
}
/*后置通知
* @AfterReturning(pointcut="anyMethod()", returning="result")
* public void doAfterReturning(String result)
* 定义返回的结果为String类型的result
* */
@AfterReturning("anyMethod()")
public void doAfterReturning(){
System.out.println("后置通知");
}
// 最终通知
@After("anyMethod()")
public void doAfter(){
System.out.println("最终通知");
}
// 例外通知 -- 发生异常时通知
@AfterThrowing("anyMethod()")
public void doAfterThrowing(){
System.out.println("例外通知");
}
// 环绕通知 --做权限时,被大量使用
@Around("anyMethod()")
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{
Object result = null;
//if () //先判断用户是否有权限
System.out.println("进入通知");
result = pjp.proceed(); // 必须执行这个方法
System.out.println("退出通知");
return result;
}
}