示例工程文档【免费下载链接】spring-reading涵盖了 Spring 框架的核心概念和关键功能包括控制反转IOC容器的使用面向切面编程AOP的原理与实践事务管理的方式与实现Spring MVC 的流程与控制器工作机制以及 Spring 中数据访问、安全、Boot 自动配置等方面的深入研究。此外它还包含了 Spring 事件机制的应用、高级主题如缓存抽象和响应式编程以及对 Spring 源码的编程风格与设计模式的深入探讨。项目地址https://gitcode.com/GitHub_Trending/sp/spring-reading点击查看免费下载一、基本信息✒️作者- Lex 博客- 掘金 源码地址- github二、基本描述Pointcut接口主要用于定义切入点即确定哪些方法应该被切面所影响。Pointcut 接口提供了匹配规则以确定在哪些类的哪些方法上应用切面以及在何种情况下应该应用切面。三、主要功能定义切入点Pointcut 接口用于定义切入点即确定哪些方法应该被切面所影响。它允许我们指定在哪些类的哪些方法上应用切面。匹配规则提供了匹配规则以确定在哪些方法上应用切面。这些规则可以基于方法的名称、参数、返回类型、类名称等多种条件来定义从而实现对切入点的精确定位。获取类过滤器getClassFilter()方法用于获取一个ClassFilter对象该对象用于确定哪些类应该被匹配。我们可以根据自己的需求自定义类过滤逻辑。获取方法匹配器getMethodMatcher()方法用于获取一个MethodMatcher对象该对象用于确定哪些方法应该被匹配。我们可以根据自己的需求自定义方法匹配逻辑。四、接口源码Pointcut接口定义了 Spring AOP 中的切入点的核心抽象由ClassFilter和MethodMatcher组成分别用于确定哪些类和方法应该被匹配。通过这个接口可以创建不同的切入点并灵活地组合它们来定义复杂的切面。接口中还定义了一个常量TRUE代表始终匹配的切入点。/** * 核心的 Spring 切入点抽象。 * * p一个切入点由一个 {link ClassFilter} 和一个 {link MethodMatcher} 组成。 * 这两个基本术语以及一个切入点本身可以组合起来构建组合例如通过 {link org.springframework.aop.support.ComposablePointcut}。 * * author Rod Johnson * see ClassFilter * see MethodMatcher * see org.springframework.aop.support.Pointcuts * see org.springframework.aop.support.ClassFilters * see org.springframework.aop.support.MethodMatchers */ public interface Pointcut { /** * 返回此切入点的 ClassFilter。 * return ClassFilter永不为 {code null} */ ClassFilter getClassFilter(); /** * 返回此切入点的 MethodMatcher。 * return MethodMatcher永不为 {code null} */ MethodMatcher getMethodMatcher(); /** * 始终匹配的规范切入点实例。 */ Pointcut TRUE TruePointcut.INSTANCE; }五、主要实现NameMatchMethodPointcut根据方法名称匹配的切入点。可以配置指定的方法名称或通配符以匹配目标类中的方法。JdkRegexpMethodPointcut使用正则表达式匹配方法的切入点。可以使用正则表达式指定方法的匹配规则。AspectJExpressionPointcut使用 AspectJ 切入点表达式匹配方法的切入点。可以使用 AspectJ 的语法来定义更灵活的切入点匹配规则。ComposablePointcut可组合的切入点允许将多个切入点组合起来使用支持与、或、非等逻辑操作。StaticMethodMatcherPointcut静态方法匹配器切入点用于直接指定方法匹配规则不支持动态匹配。TruePointcut始终匹配的切入点代表不进行任何匹配即匹配所有的类和方法。AnnotationMatchingPointcut用于基于注解匹配的切入点定义。它可以根据指定的注解类型匹配类或方法并用于将通知应用于带有特定注解的目标对象的方法。六、类关系图classDiagram direction BT class AbstractExpressionPointcut class AbstractRegexpMethodPointcut class AnnotationMatchingPointcut class AspectJExpressionPointcut class DynamicMethodMatcherPointcut class ExpressionPointcut { Interface } class JdkRegexpMethodPointcut class NameMatchMethodPointcut class Pointcut { Interface } class StaticMethodMatcherPointcut class TruePointcut AbstractExpressionPointcut .. ExpressionPointcut AbstractRegexpMethodPointcut -- StaticMethodMatcherPointcut AnnotationMatchingPointcut .. Pointcut AspectJExpressionPointcut -- AbstractExpressionPointcut DynamicMethodMatcherPointcut .. Pointcut ExpressionPointcut -- Pointcut JdkRegexpMethodPointcut -- AbstractRegexpMethodPointcut NameMatchMethodPointcut -- StaticMethodMatcherPointcut StaticMethodMatcherPointcut .. Pointcut TruePointcut .. Pointcut七、最佳实践MyCustomPointcut使用自定义的Pointcut对象MyCustomPointcut。在customPointcut方法中我们创建了MyCustomPointcut的实例并通过showMatchesLog方法展示了其对类和方法的匹配情况。最后我们通过调用showMatchesLog方法来检查MyCustomPointcut对象对目标类MyService中的方法的匹配情况并输出匹配结果。public class PointcutDemo { public static void main(String[] args) { customPointcut(); } /** * 自定义 Pointcut */ private static void customPointcut() { MyCustomPointcut pointcut new MyCustomPointcut(); showMatchesLog(pointcut); } public static void showMatchesLog(Pointcut pointcut) { try { ClassMyService target MyService.class; Method getNameMethod target.getDeclaredMethod(getName); Method getAgeMethod target.getDeclaredMethod(getAge); Method setNameMethod target.getDeclaredMethod(setName); ClassFilter classFilter pointcut.getClassFilter(); MethodMatcher methodMatcher pointcut.getMethodMatcher(); System.out.println(ClassFilter MyService classFilter.matches(target)); System.out.println(MethodMatcher MyService getName methodMatcher.matches(getNameMethod, target)); System.out.println(MethodMatcher MyService getAge methodMatcher.matches(getAgeMethod, target)); System.out.println(MethodMatcher MyService setName methodMatcher.matches(setNameMethod, target)); } catch (Exception e) { e.printStackTrace(); } } }自定义了一个自定义的切入点MyCustomPointcut该切入点匹配所有类并且匹配所有方法名以 get 开头的方法。这意味着通过该切入点定义的切面将会拦截所有类的所有以 get 开头的方法调用。class MyCustomPointcut implements Pointcut { Override public ClassFilter getClassFilter() { // 匹配所有类 return clazz - true; } Override public MethodMatcher getMethodMatcher() { return new MethodMatcher() { Override public boolean matches(Method method, Class? targetClass) { // 匹配所有以 get 开头的方法 return method.getName().startsWith(get); } Override public boolean isRuntime() { // 是否需要在运行时动态匹配 return false; } Override public boolean matches(Method method, Class? targetClass, Object... args) { // 运行时匹配这里不需要所以简单返回 false return false; } }; } }MyService类是一个示例服务类标注了类级别的MyClassAnnotation注解其中包含了三个方法getName()、setName()和getAge()。其中setName()方法标注了方法级别的MyMethodAnnotation注解。MyClassAnnotation public class MyService { public void getName() { System.out.println(getName...); } MyMethodAnnotation public void setName() { System.out.println(setName...); } public void getAge() { System.out.println(getAge...); } }运行结果MyService类级别的过滤器匹配成功而在方法级别getName和getAge方法成功匹配但setName方法未匹配成功。ClassFilter MyService true MethodMatcher MyService getName true MethodMatcher MyService getAge true MethodMatcher MyService setName falseAspectJExpressionPointcut使用AspectJExpressionPointcut创建一个基于 AspectJ 表达式的切入点。在aspectJExpressionPointcut方法中我们创建了AspectJExpressionPointcut的实例并设置了 AspectJ 表达式execution(* com.xcs.spring.MyService.get*())该表达式匹配了com.xcs.spring.MyService类中以get开头的所有方法。最后我们通过调用showMatchesLog方法来检查AspectJExpressionPointcut对象对指定类中的方法的匹配情况并输出匹配结果。public class PointcutDemo { public static void main(String[] args) { aspectJExpressionPointcut(); } /** * AspectJExpressionPointcut */ private static void aspectJExpressionPointcut() { // 创建 AspectJ 表达式切入点 AspectJExpressionPointcut pointcut new AspectJExpressionPointcut(); pointcut.setExpression(execution(* com.xcs.spring.MyService.get*())); showMatchesLog(pointcut); } }运行结果MyService类级别的过滤器匹配成功而在方法级别getName和getAge方法成功匹配但setName方法未匹配成功。ClassFilter MyService true MethodMatcher MyService getName true MethodMatcher MyService getAge true MethodMatcher MyService setName falseAnnotationMatchingPointcut使用AnnotationMatchingPointcut创建一个基于注解匹配的切入点。在annotationMatchingPointcut方法中我们创建了AnnotationMatchingPointcut的实例并指定了类级别注解MyClassAnnotation和方法级别注解MyMethodAnnotation同时设置了不检查继承的方法。最后我们通过调用showMatchesLog方法来检查AnnotationMatchingPointcut对象对指定类中的方法的匹配情况并输出匹配结果。public class PointcutDemo { public static void main(String[] args) { annotationMatchingPointcut(); } /** * AnnotationMatchingPointcut */ private static void annotationMatchingPointcut() { // 使用AnnotationMatchingPointcut切入点 AnnotationMatchingPointcut pointcut new AnnotationMatchingPointcut(MyClassAnnotation.class, MyMethodAnnotation.class, false); showMatchesLog(pointcut); } }运行结果MyService类级别的过滤器匹配成功而方法级别的匹配器成功匹配了setName方法但未匹配getName和getAge方法。ClassFilter MyService true MethodMatcher MyService getName false MethodMatcher MyService getAge false MethodMatcher MyService setName trueNameMatchMethodPointcut使用NameMatchMethodPointcut创建一个基于方法名匹配的切入点。在nameMatchMethodPointcut方法中我们创建了NameMatchMethodPointcut的实例并添加了要匹配的方法名getAge。然后我们通过调用showMatchesLog方法来检查NameMatchMethodPointcut对象对指定类中的方法的匹配情况并输出匹配结果。public class PointcutDemo { public static void main(String[] args) { nameMatchMethodPointcut(); } /** * AspectJExpressionPointcut */ private static void nameMatchMethodPointcut() { // 使用AnnotationMatchingPointcut切入点 NameMatchMethodPointcut pointcut new NameMatchMethodPointcut(); pointcut.addMethodName(getAge); showMatchesLog(pointcut); } }运行结果MyService类级别的过滤器匹配成功而方法级别的匹配器成功匹配了getAge方法但未匹配getName和setName方法。ClassFilter MyService true MethodMatcher MyService getName false MethodMatcher MyService getAge true MethodMatcher MyService setName falseJdkRegexpMethodPointcut使用JdkRegexpMethodPointcut创建一个基于 JDK 正则表达式匹配的切入点。在jdkRegexpMethodPointcut方法中我们创建了JdkRegexpMethodPointcut的实例并设置了正则表达式模式.*set.*该模式匹配了所有包含 set 字符串的方法名。然后我们通过调用showMatchesLog方法来检查JdkRegexpMethodPointcut对象对指定类中的方法的匹配情况并输出匹配结果。public class PointcutDemo { public static void main(String[] args) { jdkRegexpMethodPointcut(); } /** * JdkRegexpMethodPointcut */ private static void jdkRegexpMethodPointcut() { JdkRegexpMethodPointcut pointcut new JdkRegexpMethodPointcut(); pointcut.setPattern(.*set.*); showMatchesLog(pointcut); } }运行结果MyService类级别的过滤器匹配成功而方法级别的匹配器成功匹配了setName方法但未匹配getName和getAge方法。ClassFilter MyService true MethodMatcher MyService getName false MethodMatcher MyService getAge false MethodMatcher MyService setName true赞分享示例工程文档【免费下载链接】spring-reading涵盖了 Spring 框架的核心概念和关键功能包括控制反转IOC容器的使用面向切面编程AOP的原理与实践事务管理的方式与实现Spring MVC 的流程与控制器工作机制以及 Spring 中数据访问、安全、Boot 自动配置等方面的深入研究。此外它还包含了 Spring 事件机制的应用、高级主题如缓存抽象和响应式编程以及对 Spring 源码的编程风格与设计模式的深入探讨。项目地址https://gitcode.com/GitHub_Trending/sp/spring-reading点击查看免费下载相关推荐Spring 源码阅读深入剖析 MethodMatcher 方法匹配器——Spring AOP 切点匹配的核心接口Spring 源码阅读深入剖析 MethodMatcher 方法匹配器——Spring AOP 切点匹配的核心接口 MethodMatcher 是 Sprin示例工程文档flue/twilioFlue 框架的 Twilio 消息通道接入指南flue/twilioFlue 框架的 Twilio 消息通道接入指南 flue/twilio 是 Flue 沙箱 Agent 框架sloganThe示例工程文档Spring AOP 深度解析TargetSourceCreator 接口与自定义连接池目标源的实战实现spring-readingSpring AOP 深度解析TargetSourceCreator 接口与自定义连接池目标源的实战实现spring reading 本文以 spring示例工程文档上一篇Notesnook 标签功能完全指南给笔记打标签、浏览全部标签与设置默认标签下一篇终极指南如何让老款Mac免费升级到最新macOS系统创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考