SpringMVC快速使用AOP

2020-04-02 17:46:29 浏览数 (1)

最近突然想到了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.

0 人点赞