专栏首页大数据-数据人生SpringMVC快速使用AOP

SpringMVC快速使用AOP

最近突然想到了AOP编程,于是在自己的SpringMVC小项目中引入了。AOP一般用来做些什么呢?这里简单的使用AOP做拦截日志,来介绍下在SpringMVC中使用AOP编程。

 本君是一个有代码洁癖的程序猿,代码能少一行就少一行,不喜欢啰嗦。使用AOP最简单易用的方式就是注解咯。于是本文采用注解的方式快速使用AOP。首先,建立日志注解类,如下:

@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,实现方法如下,接口省去:

@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";  
	}

}

     接下来,就是关键的切面编写了,其实也很简单:

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;  
    }  
}

     随随便便写个单元测试方法啦,如下:

public class AopTest extends BaseTest{

	@Autowired
	AspectService aspectService;
	
	@Test
	public void test()
	{
		aspectService.save("hello");
	}
}

     对了,applicationContext.xml中别忘了加上一句:

     运行单元测试类,It's OK.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux连接信息维护

    近期由于客户端机器连接过多,导致程序报错,详见:《Spark异常:address》。这里总结下该如何查看和维护Linux机器。首先查看机器的连接数统计:

    幽鸿
  • 关于图片验证码的若干问题

    图片验证码是在登录、注册中防止机器注册、灌水等的常用一种小技术。现在贴出我的一种实现代码,也是借鉴别人的。现在主要的java类如下:

    幽鸿
  • mybatis做like模糊查询

    mybatis在做Like的模糊查询的时候,不能直接在sql语句中使用like %关键词,因为这是Mybatis的保留关键字。其实想做模糊查询很简单,随便写下...

    幽鸿
  • 09(01)总结final,多态,抽象类,接口

    1:final关键字(掌握) (1)是最终的意思,可以修饰类,方法,变量。 (2)特点: A:它修饰的类,不能被继承。 B:它修饰的方法,不能被重写。 ...

    Java帮帮
  • Java设计模式之桥梁模式

    梦想中的我自己,身价过亿,有两个大公司,一个是房地产公司,一个是服装制造公司,其实是什么公司我倒是不关心,我关心的是它赚不赚钱,赚了多少,这才是我关心的。先用类...

    CoderJed
  • TestNG用法概括

    应用场景:将通用的功能抽取并封装起来,在方法中使用注解@BeforeSuite和@AfterSuite,在测试类中继承这个类,测试类在运行前会先运行@Befor...

    桑鱼
  • 设计模式之模板方法模式(一)

    学习了前面的朋友都知道,目前为止,我们的议题都是绕着封装转;我们已经封装了对象创建、方法调用、复杂接口、鸭子、比萨…那接下来呢?

    程序员小跃
  • Spring Boot 2.X(十):自定义注册 Servlet、Filter、Listener

    在 Spring Boot 中已经移除了 web.xml 文件,如果需要注册添加 Servlet、Filter、Listener 为 Spring Bean,在...

    朝雾轻寒
  • Spring Boot 2.X(十):自定义注册 Servlet、Filter、Listener

    在 Spring Boot 中已经移除了 web.xml 文件,如果需要注册添加 Servlet、Filter、Listener 为 Spring Bean,在...

    朝雾轻寒
  • java设计模式(7)-外观模式

    上篇文章分享代理模式,这篇整理外观模式,外观模式可以降低类与类之间的耦合程度,减少维护工作量

    爱敲代码的猫

扫码关注云+社区

领取腾讯云代金券