面向切面编程spring AoP(自定义注解)

controller、service入参,出参都要埋点,埋的好恶心,再也不想去看项目了。但是如果你学过spring AoP面相切面编程,问题似乎就迎刃而解了。


1,定义切点注解:选取一个切点,可以自定义一个注解,更加灵活实用。[非必需]
2,定义切面类:具体实现,在方法的前后做什么操作。
3,配置servlet.xml。

servlet.xml
    <aop:aspectj-autoproxy />
    <!-- proxy-target-class="true"-->
    <!-- 网上说要加,但是我没有加,也好使-->
// 切面类
package com.qufenqi.controller.MyAnnotation;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

/**
 * Created by liuxin on 16/9/10.
 * <p>
 * <p>
 * 1, execution
 * (modifier-pattern?
 * ret-type-pattern declaring-type-pattern?
 * name-pattern(param-pattern) throws-pattern?)
 * pattern分别表示
 * 修饰符匹配(modifier-pattern?)、
 * 返回值匹配(ret-type-pattern)、
 * 类路径匹配(declaring-type-pattern?)、
 * 方法名匹配(name-pattern)、
 * 参数匹配((param-pattern))、
 * 异常类型匹配(throws-pattern?),
 * 其中后面跟着“?”的是可选项。
 * <p>
 * 2,  注解
 * @Before         前置通知:在某连接点(JoinPoint)之前执行的通知,
 *                     但这个通知不能阻止连接点前的执行。
 * @After          后通知:当某连接点退出的时候执行的通知
 *                    (不论是正常返回还是异常退出)。
 * @AfterReturning 返回后通知 :在某连接点正常完成后执行的通知,
 *                     不包括抛出异常的情况。
 * @Around         环绕通知 :包围一个连接点的通知,类似Web中Servlet
 *                     规范中的Filter的doFilter方法。可以
 *                   在方法的调用前后完成自定义的行为,也可以选择不执行。
 * @AfterThrowing  抛出异常后通知:在方法抛出异常退出时执行的通知。
 */
@Component
@Aspect
public class MonitorLogAspect {

    //@Pointcut("execution(* com.qufenqi.controller.TestController.getData(java.lang.Integer)) && args(i)")
    //@Pointcut("execution(* com.qufenqi.controller.TestController..*(..))")
    @Pointcut("@annotation(com.qufenqi.controller.MyAnnotation.MonitorLog)")
    public void pointcut() {

    }

    @Before("pointcut() && @annotation(monitorLog)")
    public void doBefore(JoinPoint point, MonitorLog monitorLog) {
        System.out.println("*********startMonitorLog*********");

        String[] param = monitorLog.param();
        HttpServletRequest request =
                ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        HttpSession session = request.getSession();
        String[] args = {};
        for (String key : param) {
            Object attribute = session.getAttribute(key);

        }
        System.out.println(monitorLog);
    }

    @AfterThrowing(pointcut = "pointcut() && @annotation(monitorLog)", throwing = "e")
    public void doAfterThrowing(JoinPoint joinPoint, MonitorLog monitorLog, Throwable e) {
        System.out.println("*********捕获异常开始*********");
        e.printStackTrace();
        System.out.println("*********捕获异常结束*********");
    }

    @AfterReturning(value = "pointcut() && @annotation(monitorLog)", returning = "returnValue")
    public void doAfterReturning(JoinPoint jp, MonitorLog monitorLog, Object returnValue) {
        System.out.println("*********endMonitorLog*********");

    }

}
package com.qufenqi.controller.MyAnnotation;

import java.lang.annotation.*;

/**
 * Created by liuxin on 16/9/10.
 */
@Target({ElementType.METHOD})       // 注解使用对象
@Retention(RetentionPolicy.RUNTIME) // 注解使用时机
@Documented
@Inherited // 继承
public @interface MonitorLog {

    String desc() default "";
    String[] param() default{};
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值