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