Spring AOP 的底层实现机制
2. Spring AOP 中的 Pointcut
6. 扩展 Pointcut
如何前面的 Pointcut 类型都无法满足要求,这种情况下可以扩展 Spring AOP 的 Pointcut ,给出自定义的 Pointcut。
要自定义 Pointcut ,Spring AOP 已经提供了相应的扩展抽象支持,我们只需要继承相应的抽象父类,然后实现或者覆写
方法逻辑即可。
Spring AOP 的 Pointcut 类型可以划分为 StaticMethodMatcherPointcut 和 DynamicMethodMatcherPointcut
自定义 Pointcut 只需要在这两个抽象类的基础上实现相应子类即可。
a. StaticMethodMatcherPointcut
package org.springframework.aop.support;
import org.springframework.aop.ClassFilter;
import org.springframework.aop.MethodMatcher;
import org.springframework.aop.Pointcut;
/**
* 因为是 StaticMethodMatcher,所以其 MethodMatcher 的 isRuntime 方法返回 false,
* 同时三个参数的 matches 方法抛出 UnsupportedOperationException 异常,
* 以表示该方法不应该被调用到。(该部分在 抽象父类 StaticMethodMatcher 中实现)
*
*/
public abstract class StaticMethodMatcherPointcut extends StaticMethodMatcher implements Pointcut {
private ClassFilter classFilter = ClassFilter.TRUE;
/**
* 默认子类的 ClassFilter 均为 ClassFilter.TRUE,即忽略类的类型匹配。
*/
public ClassFilter getClassFilter() {
return this.classFilter;
}
/**
* 如果子类需要对目标对象的类型做进一步的限制,可以通过该方法设置相应的 ClassFilter 实现
* @param classFilter
*/
public void setClassFilter(ClassFilter classFilter) {
this.classFilter = classFilter;
}
public final MethodMatcher getMethodMatcher() {
return this;
}
}
最终实现 自定义的StaticMethodMatcherPointcut 只需要实现两个参数的 matches 方法即可。
例如:提供一个 Pointcut , 用来扑捉系统中数据访问对象中的查询方法。
package prx.aop.pointcut;
import java.lang.reflect.Method;
import org.springframework.aop.support.StaticMethodMatcherPointcut;
public class QueryMethodPointcut extends StaticMethodMatcherPointcut {
public boolean matches(Method method, Class<?> targetClass) {
return method.getName().startsWith("query")
&& targetClass.getPackage().getName().contains("dao");
}
}
b. DynamicMethodMatcherPointcut
package org.springframework.aop.support;
import org.springframework.aop.ClassFilter;
import org.springframework.aop.MethodMatcher;
import org.springframework.aop.Pointcut;
/**
* 因为是 DynamicMethodMatcher,所以其 MethodMatcher 的 isRuntime 方法返回 true,
* 同时两个参数的 matches 也返回 true,以便三个参数的方法顺利执行
* (该部分在 抽象父类 DynamicMethodMatcher 中实现)
*/
public abstract class DynamicMethodMatcherPointcut extends DynamicMethodMatcher implements Pointcut {
/**
* 默认子类的 ClassFilter 均为 ClassFilter.TRUE,即忽略类的类型匹配。
* 如果需要特定的目标对象类型限定,需要覆盖这个方法。
*/
public ClassFilter getClassFilter() {
return ClassFilter.TRUE;
}
public final MethodMatcher getMethodMatcher() {
return this;
}
}
最终实现自定义的 DynamicMethodMatcherPointcut 只需要实现三个参数的 matches 方法即可。
例如:有个查询只有 Boss 才能访问。
package prx.aop.pointcut;
import java.lang.reflect.Method;
import org.springframework.aop.support.DynamicMethodMatcherPointcut;
public class BossQueryMethodPointcut extends DynamicMethodMatcherPointcut {
public boolean matches(Method method, Class<?> targetClass, Object[] args) {
if(method.getName().startsWith("query")
&& targetClass.getPackage().getName().contains("dao")) {
if(args != null && args.length > 1) {
return "Boss".equals(args[0]);
}
}
return false;
}
}
如果愿意,也可以覆盖 两个参数的 matches 方法,这样,不用每次都得到三个参数的 matches 方法执行的时候才检查
所有的条件。
将 Pointcut 加入 IoC 容器中
选择好了 Pointcut ,剩下就是 将它们加入Spring IoC 容器中,以便 Spring 管理。 Spring 中的 Pointcut 实现都是
普通的 Java 对象, 所以想普通的 POJO 那样配置注入就可以了。
<bean id="nameMatchPointcut" class="org.springframework.aop.support.NameMatchMethodPointcut">
<property name="mappedNames">
<list>
<value>methodName1</value>
<value>methodName2</value>
</list>
</property>
</bean>
- 大小: 28.2 KB
分享到:
相关推荐
Spring AOP 是一种面向切面编程的技术,它允许我们在不修改源代码的情况下,对应用程序的特定部分(如方法调用)进行增强。在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态...
AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析...
**Spring AOP 实现机制详解** Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许程序员在不修改源代码的情况下,通过“切面”来插入额外的业务逻辑,如日志、事务管理等。AOP的引入极大地提高了代码的...
《Spring AOP 源码分析》 在深入探讨Spring AOP之前,我们先要理解AOP(面向切面编程)的基本概念。AOP是一种编程范式,它将关注点分离,使得我们可以将横切关注点(如日志、事务管理、安全检查等)与业务逻辑解耦...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和抽象化的方法来处理系统中的交叉关注点,如日志、事务管理、安全性等。本学习笔记将深入探讨Spring AOP的核心概念、工作原理以及实际...
在本文中,我们将从实现的角度来认识 SpringAOP 框架,从外部接口、内部实现、组成部分、执行过程四个方面来介绍 Spring AOP 框架的结构分析。 最后,本文的目标是从实现的角度来认识 SpringAOP 框架,观察的角度是...
**Spring AOP 简介** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要模块,它扩展了传统的面向对象编程,允许开发者定义“横切关注点”(cross-cutting concerns),如日志、事务...
在IT领域,Spring框架是一个广泛使用的Java应用框架,它提供了许多功能,包括依赖注入、面向切面编程(AOP)等。"spring-aop-jar"这个主题涉及到Spring框架中的核心组件之一——Spring AOP。这里我们将深入探讨...
在本文中,我们将深入探讨Spring AOP的运用,并结合源码分析其工作原理。 首先,了解AOP的基本概念: 1. 切面(Aspect):切面是关注点的模块化,这些关注点通常是跨越多个对象的横切关注点,例如事务管理、日志...
Spring AOP,全称Aspect-Oriented Programming,是Spring框架中的一个重要组成部分,它引入了面向切面编程的概念,使得开发者可以将关注点分离,更好地实现业务逻辑与系统服务的解耦。在这个经典例子中,我们将深入...
6. **代理(Proxy)**:Spring AOP通过动态创建代理对象来实现切面的功能。有JDK动态代理和CGLIB代理两种方式,JDK代理用于接口,CGLIB代理用于无接口类。 接下来,我们探讨如何在Spring中配置和使用AOP: 1. **...
本篇文章将深入探讨如何使用Spring AOP实现性能监控器,并通过源码分析来理解其工作原理。 首先,我们要了解AOP的核心概念——切面(Aspect)、通知(Advice)、连接点(Join Point)、切入点(Pointcut)和织入...
**Spring AOP 使用实例** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要组成部分,它提供了一种在不修改原有代码的情况下,通过代理方式添加额外功能的技术。这种技术使得我们...
在提供的压缩包文件"springAOP"中,可能包含了以下内容: - **切面类(Aspect Class)**:包含切点和通知的Java类,可能使用了`@Aspect`注解。 - **目标类(Target Class)**:被AOP代理的对象,通常包含业务逻辑。...
Spring AOP(面向切面编程)是Spring框架的一个重要组成部分,它允许开发者将横切关注点与业务逻辑分离,实现业务逻辑的模块化。AOP核心组件包括几个关键概念,如切面(Aspect)、通知(Advice)、连接点(Joinpoint...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、事务管理、性能监控等。在Java应用中,AOP通过代理模式实现,使得我们可以将横切关注...
**Spring AOP 实现详解** 在Java开发中,Spring框架以其强大的功能和灵活性深受开发者喜爱。其中,AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架的一个重要特性,它允许开发者将关注点从核心业务...
Spring AOP 源码分析笔记 Spring AOP(Aspect-Oriented Programming)是一种编程范式,它允许开发者 modularize cross-cutting concerns,即将横切关注点模块化。AOP 使得开发者可以将一些公共的功能模块化,以便在...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、事务管理、性能监控等。AOP的核心概念包括切面(Aspect)、通知(Advice)、连接点...