Pointcut與Advisor實現AOP


  在研究事務的時候發現事務的AOP類TransactionInterceptor是實現了接口MethodInterceptor,於是想着研究下這種AOP的實現方式。

1. 實現方式1如下

1.實現MethodInterceptor接口。(扮演Advice通知的角色)

  簡單的實現方法執行前、執行后打印一下日志。

package cn.qlq.aop;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class MyInterceptor implements MethodInterceptor {

    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        System.out.println(invocation.getMethod() + "==方法執行前==");
        Object proceed = invocation.proceed();
        System.out.println(invocation.getArguments() + "--方法執行后--");
        return proceed;
    }

}

其實MethodInterceptor接口繼承Interceptor、Interceptor接口繼承Advice接口。這些接口是org.aopalliance包下的(spring-aop包)

2.實現接口Pointcut(扮演切入點的角色)

  根據類名稱、方法名稱判斷是否滿足指定的過濾條件。

package cn.qlq.aop;

import java.lang.reflect.Method;

import org.apache.commons.lang3.StringUtils;
import org.springframework.aop.ClassFilter;
import org.springframework.aop.MethodMatcher;
import org.springframework.aop.Pointcut;

public class MyPoint implements Pointcut {

    @Override
    public ClassFilter getClassFilter() {
        return new ClassFilter() {
            @Override
            public boolean matches(Class<?> clazz) {
                // 如果ServiceImpl就返回true
                if (clazz != null && StringUtils.contains(clazz.getName(), "cn.qlq.service")) {
                    System.out.println("======MyPoint======getClassFilter ");
                    System.out.println(clazz);
                    return true;
                }

                return false;
            }
        };
    }

    @Override
    public MethodMatcher getMethodMatcher() {
        return new MethodMatcher() {

            /**
             * 判斷方法是否匹配
             */
            @Override
            public boolean matches(Method method, Class<?> targetClass, Object... args) {
                System.out.println("matches=========1");
                System.out.println(method);
                System.out.println(targetClass);
                System.out.println(args);
                return true;
            }

            /**
             * 判斷方法是否匹配
             */
            @Override
            public boolean matches(Method method, Class<?> targetClass) {
                System.out.println("matches=========2");
                System.out.println(method);
                System.out.println(targetClass);
                return true;
            }

            @Override
            public boolean isRuntime() {
                return false;
            }
        };
    }

}

3.增加配置類實現PointcutAdvisor。注意要注入到spring容器中。(扮演切面Aspect的角色)

package cn.qlq.aop;

import org.aopalliance.aop.Advice;
import org.springframework.aop.Pointcut;
import org.springframework.aop.PointcutAdvisor;
import org.springframework.stereotype.Component;

@Component
public class MyAdvicer implements PointcutAdvisor {

    @Override
    public Advice getAdvice() {
        return new MyInterceptor();
    }

    @Override
    public boolean isPerInstance() {
        return true;
    }

    @Override
    public Pointcut getPointcut() {
        return new MyPoint();
    }

}

 

2. 實現方式2如下:

增強類:

package cn.qlq.aop;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class MyInterceptor implements MethodInterceptor {

    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        System.out.println(invocation.getMethod() + "==方法執行前==");
        Object proceed = invocation.proceed();
        System.out.println(invocation.getArguments() + "--方法執行后--");
        return proceed;
    }

}

配置類:

package cn.qlq.aop;

import org.springframework.aop.aspectj.AspectJExpressionPointcut;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyInterceptorConfig {

    public static final String traceExecution = "execution(* cn.qlq.service..*.*(..))";

    @Bean
    public DefaultPointcutAdvisor defaultPointcutAdvisor2() {
        AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
        pointcut.setExpression(traceExecution);

        // 配置增強類advisor
        DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor();
        advisor.setPointcut(pointcut);
        MyInterceptor interceptor = new MyInterceptor();
        advisor.setAdvice(interceptor);
        return advisor;
    }

}

 

 還有另一種方式就是自定義注解加@Aspect方式實現AOP。參考:https://www.cnblogs.com/qlqwjy/p/8729280.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM