当前位置: 首页 > web >正文

[spring6: AspectMetadata AspectInstanceFactory]-源码解析

AspectMetadata

AspectMetadata 类用于存储与 AspectJ 方面相关的元数据,特别是与 Spring AOP 集成时的 “per” 子句相关信息。它使用 AspectJ 5 的反射 API,支持多种 AspectJ 实例化模型,如 “singleton”、“pertarget” 和 “perthis”。

@SuppressWarnings("serial")
public class AspectMetadata implements Serializable {// Aspect 的名称,通常作为 Spring 的 bean 名称,决定多个通知之间的优先级private final String aspectName;// Aspect 类本身,提供反射所需的类信息。private final Class<?> aspectClass;// AspectJ 的反射类型,用于访问 AspectJ 特定的元数据。private transient AjType<?> ajType;// 与 AspectJ 的 "per" 子句相关的 Spring AOP 切点,决定了实例化模型(例如 singleton 或 pertarget)private final Pointcut perClausePointcut;public AspectMetadata(Class<?> aspectClass, String aspectName) {this.aspectName = aspectName;Class<?> currClass = aspectClass;AjType<?> ajType = null;while (currClass != Object.class) {AjType<?> ajTypeToCheck = AjTypeSystem.getAjType(currClass);if (ajTypeToCheck.isAspect()) {ajType = ajTypeToCheck;break;}currClass = currClass.getSuperclass();}if (ajType == null) {throw new IllegalArgumentException("Class '" + aspectClass.getName() + "' is not an @AspectJ aspect");}if (ajType.getDeclarePrecedence().length > 0) {throw new IllegalArgumentException("DeclarePrecedence not presently supported in Spring AOP");}this.aspectClass = ajType.getJavaClass();this.ajType = ajType;switch (this.ajType.getPerClause().getKind()) {case SINGLETON -> {this.perClausePointcut = Pointcut.TRUE;}case PERTARGET, PERTHIS -> {AspectJExpressionPointcut ajexp = new AspectJExpressionPointcut();ajexp.setLocation(aspectClass.getName());ajexp.setExpression(findPerClause(aspectClass));ajexp.setPointcutDeclarationScope(aspectClass);this.perClausePointcut = ajexp;}case PERTYPEWITHIN -> {// Works with a type patternthis.perClausePointcut = new ComposablePointcut(new TypePatternClassFilter(findPerClause(aspectClass)));}default -> throw new AopConfigException("PerClause " + ajType.getPerClause().getKind() + " not supported by Spring AOP for " + aspectClass);}}// 从 AspectJ 注解中提取 "per" 子句的内容private String findPerClause(Class<?> aspectClass) {Aspect ann = aspectClass.getAnnotation(Aspect.class);if (ann == null) {return "";}String value = ann.value();int beginIndex = value.indexOf('(');if (beginIndex < 0) {return "";}return value.substring(beginIndex + 1, value.length() - 1);}public boolean isPerThisOrPerTarget() {PerClauseKind kind = getAjType().getPerClause().getKind();return (kind == PerClauseKind.PERTARGET || kind == PerClauseKind.PERTHIS);}public boolean isPerTypeWithin() {PerClauseKind kind = getAjType().getPerClause().getKind();return (kind == PerClauseKind.PERTYPEWITHIN);}public boolean isLazilyInstantiated() {return (isPerThisOrPerTarget() || isPerTypeWithin());}private void readObject(ObjectInputStream inputStream) throws IOException, ClassNotFoundException {inputStream.defaultReadObject();this.ajType = AjTypeSystem.getAjType(this.aspectClass);}}

AspectInstanceFactory

AspectInstanceFactory 是一个接口,用于提供切面实例并允许指定类加载器,同时通过实现 Ordered 接口来控制切面执行的顺序。

public interface AspectInstanceFactory extends Ordered {Object getAspectInstance();@NullableClassLoader getAspectClassLoader();}

SimpleAspectInstanceFactory

SimpleAspectInstanceFactoryAspectInstanceFactory 的实现,每次调用 getAspectInstance() 时都会创建一个新的切面实例,并提供切面类加载器和顺序控制功能。

public class SimpleAspectInstanceFactory implements AspectInstanceFactory {private final Class<?> aspectClass;public SimpleAspectInstanceFactory(Class<?> aspectClass) {Assert.notNull(aspectClass, "Aspect class must not be null");this.aspectClass = aspectClass;}public final Class<?> getAspectClass() {return this.aspectClass;}@Overridepublic final Object getAspectInstance() {try {return ReflectionUtils.accessibleConstructor(this.aspectClass).newInstance();}catch (NoSuchMethodException ex) {throw new AopConfigException("No default constructor on aspect class: " + this.aspectClass.getName(), ex);}catch (InstantiationException ex) {throw new AopConfigException("Unable to instantiate aspect class: " + this.aspectClass.getName(), ex);}catch (IllegalAccessException ex) {throw new AopConfigException("Could not access aspect constructor: " + this.aspectClass.getName(), ex);}catch (InvocationTargetException ex) {throw new AopConfigException("Failed to invoke aspect constructor: " + this.aspectClass.getName(), ex.getTargetException());}}@Override@Nullablepublic ClassLoader getAspectClassLoader() {return this.aspectClass.getClassLoader();}@Overridepublic int getOrder() {return getOrderForAspectClass(this.aspectClass);}protected int getOrderForAspectClass(Class<?> aspectClass) {return Ordered.LOWEST_PRECEDENCE;}}

SingletonAspectInstanceFactory

SingletonAspectInstanceFactoryAspectInstanceFactory 的实现,它使用一个指定的单例对象,每次调用 getAspectInstance() 都返回相同的实例,同时支持类加载器和顺序控制功能。

@SuppressWarnings("serial")
public class SingletonAspectInstanceFactory implements AspectInstanceFactory, Serializable {private final Object aspectInstance;public SingletonAspectInstanceFactory(Object aspectInstance) {Assert.notNull(aspectInstance, "Aspect instance must not be null");this.aspectInstance = aspectInstance;}@Overridepublic final Object getAspectInstance() {return this.aspectInstance;}@Override@Nullablepublic ClassLoader getAspectClassLoader() {return this.aspectInstance.getClass().getClassLoader();}@Overridepublic int getOrder() {if (this.aspectInstance instanceof Ordered ordered) {return ordered.getOrder();}return getOrderForAspectClass(this.aspectInstance.getClass());}protected int getOrderForAspectClass(Class<?> aspectClass) {return Ordered.LOWEST_PRECEDENCE;}}

MetadataAwareAspectInstanceFactory

MetadataAwareAspectInstanceFactoryAspectInstanceFactory 的子接口,专门用于返回与 AspectJ 注解类相关的 AspectMetadata,并提供获取创建互斥锁的方法。

public interface MetadataAwareAspectInstanceFactory extends AspectInstanceFactory {AspectMetadata getAspectMetadata();@NullableObject getAspectCreationMutex();}

SimpleMetadataAwareAspectInstanceFactory

SimpleMetadataAwareAspectInstanceFactorySimpleAspectInstanceFactory 的扩展实现,提供了 MetadataAwareAspectInstanceFactory 接口的功能,能够为每次调用 getAspectInstance() 时创建指定的 Aspect 类的实例,并返回与之关联的 AspectMetadata

public class SimpleMetadataAwareAspectInstanceFactory extends SimpleAspectInstanceFactory implements MetadataAwareAspectInstanceFactory {private final AspectMetadata metadata;public SimpleMetadataAwareAspectInstanceFactory(Class<?> aspectClass, String aspectName) {super(aspectClass);this.metadata = new AspectMetadata(aspectClass, aspectName);}@Overridepublic final AspectMetadata getAspectMetadata() {return this.metadata;}@Overridepublic Object getAspectCreationMutex() {return this;}@Overrideprotected int getOrderForAspectClass(Class<?> aspectClass) {return OrderUtils.getOrder(aspectClass, Ordered.LOWEST_PRECEDENCE);}}

SingletonMetadataAwareAspectInstanceFactory

SingletonMetadataAwareAspectInstanceFactorySingletonAspectInstanceFactory 的扩展,实现了 MetadataAwareAspectInstanceFactory 接口。它主要用于为给定的单例 aspect 实例提供元数据支持,并返回相同的 aspect 实例

@SuppressWarnings("serial")
public class SingletonMetadataAwareAspectInstanceFactory extends SingletonAspectInstanceFactory implements MetadataAwareAspectInstanceFactory, Serializable {private final AspectMetadata metadata;public SingletonMetadataAwareAspectInstanceFactory(Object aspectInstance, String aspectName) {super(aspectInstance);this.metadata = new AspectMetadata(aspectInstance.getClass(), aspectName);}@Overridepublic final AspectMetadata getAspectMetadata() {return this.metadata;}@Overridepublic Object getAspectCreationMutex() {return this;}@Overrideprotected int getOrderForAspectClass(Class<?> aspectClass) {return OrderUtils.getOrder(aspectClass, Ordered.LOWEST_PRECEDENCE);}}

BeanFactoryAspectInstanceFactory

BeanFactoryAspectInstanceFactory 是一个实现了 MetadataAwareAspectInstanceFactory 接口的类,它通过 Spring 的 BeanFactory 来实例化和管理 Aspect,支持单例与原型模式,并能够处理 AspectJ 元数据和生命周期。

@SuppressWarnings("serial")
public class BeanFactoryAspectInstanceFactory implements MetadataAwareAspectInstanceFactory, Serializable {private final BeanFactory beanFactory;private final String name;private final AspectMetadata aspectMetadata;public BeanFactoryAspectInstanceFactory(BeanFactory beanFactory, String name) {this(beanFactory, name, null);}public BeanFactoryAspectInstanceFactory(BeanFactory beanFactory, String name, @Nullable Class<?> type) {Assert.notNull(beanFactory, "BeanFactory must not be null");Assert.notNull(name, "Bean name must not be null");this.beanFactory = beanFactory;this.name = name;Class<?> resolvedType = type;if (resolvedType == null) {resolvedType = beanFactory.getType(name);Assert.notNull(resolvedType, "Unresolvable bean type - explicitly specify the aspect class");}this.aspectMetadata = new AspectMetadata(resolvedType, name);}@Overridepublic Object getAspectInstance() {return this.beanFactory.getBean(this.name);}@Override@Nullablepublic ClassLoader getAspectClassLoader() {return (this.beanFactory instanceof ConfigurableBeanFactory cbf ?cbf.getBeanClassLoader() : ClassUtils.getDefaultClassLoader());}@Overridepublic AspectMetadata getAspectMetadata() {return this.aspectMetadata;}@Override@Nullablepublic Object getAspectCreationMutex() {if (this.beanFactory.isSingleton(this.name)) {return null;}else {return this;}}@Overridepublic int getOrder() {Class<?> type = this.beanFactory.getType(this.name);if (type != null) {if (Ordered.class.isAssignableFrom(type) && this.beanFactory.isSingleton(this.name)) {return ((Ordered) this.beanFactory.getBean(this.name)).getOrder();}return OrderUtils.getOrder(type, Ordered.LOWEST_PRECEDENCE);}return Ordered.LOWEST_PRECEDENCE;}@Overridepublic String toString() {return getClass().getSimpleName() + ": bean name '" + this.name + "'";}}

PrototypeAspectInstanceFactory

PrototypeAspectInstanceFactory 继承自 BeanFactoryAspectInstanceFactory,用于通过 BeanFactory 创建原型模式的 Aspect 实例。它确保所提供的 Bean 是原型类型,如果不是,则抛出 IllegalArgumentException 异常。

@SuppressWarnings("serial")
public class PrototypeAspectInstanceFactory extends BeanFactoryAspectInstanceFactory implements Serializable {public PrototypeAspectInstanceFactory(BeanFactory beanFactory, String name) {super(beanFactory, name);if (!beanFactory.isPrototype(name)) {throw new IllegalArgumentException("Cannot use PrototypeAspectInstanceFactory with bean named '" + name + "': not a prototype");}}}

LazySingletonAspectInstanceFactoryDecorator

LazySingletonAspectInstanceFactoryDecorator 是一个装饰器,用于确保 MetadataAwareAspectInstanceFactory 只实例化一次。在首次访问时,它延迟实例化并缓存生成的 aspectInstance,后续访问直接返回缓存的实例。

@SuppressWarnings("serial")
public class LazySingletonAspectInstanceFactoryDecorator implements MetadataAwareAspectInstanceFactory, Serializable {private final MetadataAwareAspectInstanceFactory maaif;@Nullableprivate volatile Object materialized;public LazySingletonAspectInstanceFactoryDecorator(MetadataAwareAspectInstanceFactory maaif) {Assert.notNull(maaif, "AspectInstanceFactory must not be null");this.maaif = maaif;}@Overridepublic Object getAspectInstance() {Object aspectInstance = this.materialized;if (aspectInstance == null) {Object mutex = this.maaif.getAspectCreationMutex();if (mutex == null) {aspectInstance = this.maaif.getAspectInstance();this.materialized = aspectInstance;}else {synchronized (mutex) {aspectInstance = this.materialized;if (aspectInstance == null) {aspectInstance = this.maaif.getAspectInstance();this.materialized = aspectInstance;}}}}return aspectInstance;}public boolean isMaterialized() {return (this.materialized != null);}@Override@Nullablepublic ClassLoader getAspectClassLoader() {return this.maaif.getAspectClassLoader();}@Overridepublic AspectMetadata getAspectMetadata() {return this.maaif.getAspectMetadata();}@Override@Nullablepublic Object getAspectCreationMutex() {return this.maaif.getAspectCreationMutex();}@Overridepublic int getOrder() {return this.maaif.getOrder();}@Overridepublic String toString() {return "LazySingletonAspectInstanceFactoryDecorator: decorating " + this.maaif;}}
http://www.xdnf.cn/news/15891.html

相关文章:

  • PCIe RAS学习专题(3):AER内核处理流程梳理
  • 消息队列:数字化通信的高效纽带
  • 1009 - 数组逆序
  • Spring监听器
  • 2.4 组件间通信Props(父传子)
  • Rust Web 全栈开发(九):增加教师管理功能
  • 【SVM smote】MAP - Charting Student Math Misunderstandings
  • Custom SRP - Custom Render Pipeline
  • RabbitMQ01——基础概念、docker配置rabbitmq、内部执行流程、五种消息类型、测试第一种消息类型
  • RabbitMQ—事务与消息分发
  • 软考 系统架构设计师系列知识点之杂项集萃(113)
  • AJAX概述
  • c++ 基本语法易错与技巧总结
  • 零基础学习性能测试-linux服务器监控:内存监控
  • fastjson2 下划线字段转驼峰对象
  • 【RK3576】【Android14】分区划分
  • 石子问题(区间dp)
  • 从Prompt到结构建模:如何以数据驱动重构日本语言学校体系?以国际日本语学院为例
  • Linux:lvs集群技术
  • LVS四种工作模式深度解析
  • 千线万网,电路之行——LVS检查的内核逻辑
  • Python day18
  • 统计EfficientNet-B7的参数个数。
  • 华为擎云L420安装LocalSend
  • 单元测试学习+AI辅助单测
  • 【图像处理基石】什么是小波变换?
  • 美国VPS服务器Linux内核参数调优的实践与验证
  • iOS 通知机制及底层原理
  • 突破 MySQL 性能瓶颈:死锁分析 + 慢查询诊断 + 海量数据比对实战
  • 【设计模式C#】状态模式(用于解决解耦多种状态之间的交互)