Spring AOP 自定义 PointcutAdvicePointcut相关类类图

tech2025-10-01  12

Composing multiple pointcuts together

Handling control flow pointcuts

Performing simple name-based matching

Defining pointcuts using regular expressions

Defining pointcuts using AspectJ expressions

Defining pointcuts that look for specific annotations at the class or method level

 

AOP Pointcut 常见用法

PiontCut UML图

import com.apress.prospring5.ch2.common.Singer; public class GoodGuitarist implements Singer { @Override public void sing() { System.out.println("Who says I can't be free \n" + "From all of the things that I used to be"); } } public class GreatGuitarist implements Singer { @Override public void sing() { System.out.println("I shot the sheriff, \n" + "But I did not shoot the deputy"); } } import java.lang.reflect.Method; import org.springframework.aop.ClassFilter; import org.springframework.aop.support.StaticMethodMatcherPointcut; public class SimpleStaticPointcut extends StaticMethodMatcherPointcut { @Override public boolean matches(Method method, Class<?> cls) { return ("sing".equals(method.getName())); } @Override public ClassFilter getClassFilter() { return cls -> (cls == GoodGuitarist.class); } } public ClassFilter getClassFilter() { return new ClassFilter() { public boolean matches(Class<?> cls) { return (cls == GoodGuitarist.class); } }; } import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; public class SimpleAdvice implements MethodInterceptor { @Override public Object invoke(MethodInvocation invocation) throws Throwable { System.out.println(">> Invoking " + invocation.getMethod().getName()); Object retVal = invocation.proceed(); System.out.println(">> Done\n"); return retVal ; } } import com.apress.prospring5.ch2.common.Singer; import org.aopalliance.aop.Advice; import org.springframework.aop.Advisor; import org.springframework.aop.Pointcut; import org.springframework.aop.framework.ProxyFactory; import org.springframework.aop.support.DefaultPointcutAdvisor; public class StaticPointcutDemo { public static void main(String... args) { GoodGuitarist johnMayer = new GoodGuitarist(); GreatGuitarist ericClapton = new GreatGuitarist(); Singer proxyOne; Singer proxyTwo; Pointcut pc = new SimpleStaticPointcut(); Advice advice = new SimpleAdvice(); Advisor advisor = new DefaultPointcutAdvisor(pc, advice); ProxyFactory pf = new ProxyFactory(); pf.addAdvisor(advisor); pf.setTarget(johnMayer); proxyOne = (Singer)pf.getProxy(); pf = new ProxyFactory(); pf.addAdvisor(advisor); pf.setTarget(ericClapton); proxyTwo = (Singer)pf.getProxy(); proxyOne.sing(); proxyTwo.sing(); } }

自定义 Advice, Pointcut, 生成Adviser

最新回复(0)