最近突然想到了AOP编程,于是在自己的SpringMVC小项目中引入了。AOP一般用来做些什么呢?这里简单的使用AOP做拦截日志,来介绍下在SpringMVC中使用AOP编程。
本君是一个有代码洁癖的程序猿,代码能少一行就少一行,不喜欢啰嗦。使用AOP最简单易用的方式就是注解咯。于是本文采用注解的方式快速使用AOP。首先,建立日志注解类,如下:
代码语言:javascript复制@Target({ElementType.PARAMETER,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface LogAnno {
/**
* @Title: operation
* @Description: 定义操作类型
* @param @return 设定文件
* @return String 返回类型
* @throws
*/
String operation();
}
有了注解类后,我们可以在我们的随便Service或者Controller层需要被切面拦截的方法上加上注解即可,这点我非常喜欢,想拦谁拦谁,不用搞什么*、什么的匹配的一大堆。
这里建立一个测试Service,实现方法如下,接口省去:
代码语言:javascript复制@Service("aspectService")
public class AspectServiceImpl implements AspectService{
@Override
@LogAnno(operation = BlogConst.OPERATION_VISIT_INDEX)
public void save(String name) {
// TODO Auto-generated method stub
System.out.println("我是save方法");
}
@Override
public void update(String name, Integer id) {
// TODO Auto-generated method stub
System.out.println("我是update()方法");
}
@Override
public String getPersonName(Integer id) {
// TODO Auto-generated method stub
System.out.println("我是getPersonName()方法");
return "xxx";
}
}
接下来,就是关键的切面编写了,其实也很简单:
代码语言:javascript复制package com.aspect;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import com.common.LogAnno;
@Aspect
public class LogAspect {
//定义一个切入点 ,不管有用没用,好像不可缺少
@Pointcut("execution(* com.service.impl.*.*(..))")
private void anyMethod(){}
// @Before("anyMethod() && @annotation(logAnno)")
@Before("@annotation(logAnno)")
public void before(LogAnno logAnno){
System.out.println("前置通知:" logAnno.operation());
}
// @AfterReturning("anyMethod()")
public void afterReturning(){
System.out.println("后置通知");
}
// @After("anyMethod()")
public void after(){
System.out.println("最终通知");
}
@AfterThrowing("anyMethod()")
public void afterThrow(){
System.out.println("例外通知");
}
// @Around("anyMethod()")
public Object around(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("进入环绕通知");
Object object = pjp.proceed();//执行该方法
System.out.println("退出方法");
return object;
}
}
随随便便写个单元测试方法啦,如下:
代码语言:javascript复制public class AopTest extends BaseTest{
@Autowired
AspectService aspectService;
@Test
public void test()
{
aspectService.save("hello");
}
}
对了,applicationContext.xml中别忘了加上一句:
运行单元测试类,It's OK.