spring · 2024-07-31 0

ProxyFactory 使用

1.pom 依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>5.1.9.RELEASE</version>
</dependency>

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
    <scope>test</scope>
</dependency>

2.java

public interface StudentService {

    String say1(String msg);

    String say2(String msg);
}
public class StudentServiceImpl implements StudentService {

    @Override
    public String say1(String msg) {
        return msg;
    }

    @Override
    public String say2(String msg) {
        return msg;
    }
}
@Test
public void testProxyFactory() {
    StudentService studentService = new StudentServiceImpl();

    MethodInterceptor interceptor1 = new MethodInterceptor() {
        @Override
        public Object invoke(MethodInvocation invocation) throws Throwable {
            System.out.println("- - - interceptor1 - - -");
            return invocation.proceed();
        }
    };

    MethodInterceptor interceptor2 = new MethodInterceptor() {
        @Override
        public Object invoke(MethodInvocation invocation) throws Throwable {
            System.out.println("- - - interceptor2 - - -");
            return invocation.proceed();
        }
    };

    MethodInterceptor interceptor3 = new MethodInterceptor() {
        @Override
        public Object invoke(MethodInvocation invocation) throws Throwable {
            System.out.println("- - - interceptor3 - - -");
            return invocation.proceed();
        }
    };

    MethodInterceptor interceptor4 = new MethodInterceptor() {
        @Override
        public Object invoke(MethodInvocation invocation) throws Throwable {
            System.out.println("- - - interceptor4 - - -");
            return invocation.proceed();
        }
    };

    // AnnotationMatchingPointcut 会拦截被指定注解标注的类
    // NameMatchMethodPointcut 匹配方法名
    NameMatchMethodPointcut pointcut1 = new NameMatchMethodPointcut();
    NameMatchMethodPointcut pointcut2 = new NameMatchMethodPointcut();
    pointcut1.addMethodName("say1");
    pointcut2.addMethodName("say1");

    DefaultPointcutAdvisor advisor1 = new DefaultPointcutAdvisor(pointcut1, interceptor3);
    DefaultPointcutAdvisor advisor2 = new DefaultPointcutAdvisor(pointcut2, interceptor4);

    ProxyFactory factory = new ProxyFactory();

    factory.setInterfaces(StudentService.class);
    factory.setTarget(studentService);
    // Advice 是切面中的行为或逻辑,advice 会生成 new DefaultPointcutAdvisor(advice),会拦截所有的方法
    factory.addAdvice(interceptor1);
    factory.addAdvice(interceptor2);
    // Advisor 则将 Advice 和 Pointcut 结合起来,形成一个完整的切面定义
    factory.addAdvisor(advisor1);
    factory.addAdvisor(advisor2);

    StudentService service = (StudentService) factory.getProxy();
    String str1 = service.say1("hello zhangsan");
    System.out.println(str1);
    System.out.println("- - - - - -");
    String str2 = service.say2("hello lisi");
    System.out.println(str2);
}

结果:

- - - interceptor1 - - -
- - - interceptor2 - - -
- - - interceptor3 - - -
- - - interceptor4 - - -
hello zhangsan
- - - - - -
- - - interceptor1 - - -
- - - interceptor2 - - -
hello lisi