在spring中,AOP和IOC都是spring非常重要的特性,而在web开发中,定义切面、增强方法也是比较常见的,比如做统一的日志管理相关的、自定义的注解处理、或者在处理用户请求的前后我们需要做一些处理,等等,这时我们都可以使用切面来实现,而在以前,使用切面我们可能需要使用很多接口和类,现在,我们只需要@Aspect这一个注解就可以定义切面。
首先,我们定义一个类,然后在这个类上使用@Aspect注解,这样一个切面就定义好了,我们可以再加上@Component注解,这样就把这个切面交给Spring容器来管理。
1 |
|
接下来就是定义切点,并对切点做一些增强操作:前置增强、环绕增强、后置增强等等,切点的定义我们可以在一个空方法体的方法上使用@Pointcut注解
1 | "@annotation(com.sino.baseline.common.annotation.InitQueryParam)") ( |
@Pointcut()里面定义的是切点表达式,切点表达式有很多,上面例子代码中的是注解表达式,标注来指定注解的目标类或者方法,就比如凡是使用了com.sino.baseline.common.annotation.InitQueryParam这个注解的类或者方法都是切点。除了@annotation()还有几类比较常见的切点表达式:
1.execution(方法修饰符 返回类型 方法全限定名 参数)
匹配指定的方法,例如.
1 | "execution(* com.tcb.controller.SDProductController.showproductDetail(..))") ( |
好了,增强主要有以下几种:
1.@Before
前置增强,在切点方法执行之前执行。这里多说几句,在增强方法中要获取request可以通过下面来获取:
1 | ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); |
在前置增强中,想要获取切点方法的参数可以通过joinPoint.getArgs[]来获取,获取方法名可以通过joinPoint.getSignature().getDeclaringTypeName()来获取。
2.@Around
环绕增强.
3.@AfterReturning
后置增强,切点方法正常执行完返回后执行,如果有异常抛出而退出,则不会执行增强方法
4.@AfterThrowing
后置增强,只有切点方法异常抛出而退出后执行
5.@After
也是后置增强,但不管切点方法是正常退出还是异常退出都会执行
好了,以上就是AOP开发基于@Aspect等注解的使用方法,有新的心得再随时修改或者写第二篇,有不对的地方欢迎指摘,吃饭喽