前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringMVC快速使用AOP

SpringMVC快速使用AOP

作者头像
幽鸿
发布2020-04-02 17:46:29
4010
发布2020-04-02 17:46:29
举报

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档