天天看點

【源碼】Spring AOP 6 AspectInstanceFactory前言AspectInstanceFactory類圖總結

【源碼】Spring AOP 6 AspectInstanceFactory

  • 前言
  • AspectInstanceFactory
    • SimpleBeanFactoryAwareAspectInstanceFactory
    • SimpleAspectInstanceFactory
    • MetadataAwareAspectInstanceFactory
    • SingletonAspectInstanceFactory
      • SimpleMetadataAwareAspectInstanceFactory
      • SingletonMetadataAwareAspectInstanceFactory
      • BeanFactoryAspectInstanceFactory
      • LazySingletonAspectInstanceFactoryDecorator
  • 類圖
  • 總結

前言

此章節介紹 AspectInstanceFactory ,該組類主要用于從給定的類(或者 beanName 等)擷取一個切面執行個體

AspectInstanceFactory

public interface AspectInstanceFactory extends Ordered {

	// 建立切面執行個體
	Object getAspectInstance();

	// 暴露切面的類加載器
	@Nullable
	ClassLoader getAspectClassLoader();

}
           

頂層接口,解析 Aspect 切面執行個體的工廠,将切面解析的工作從 Spring AOP 中解耦出來。

【源碼】Spring AOP 6 AspectInstanceFactory前言AspectInstanceFactory類圖總結

SimpleBeanFactoryAwareAspectInstanceFactory

public class SimpleBeanFactoryAwareAspectInstanceFactory implements AspectInstanceFactory, BeanFactoryAware {

	@Nullable
	private String aspectBeanName;

	@Nullable
	private BeanFactory beanFactory;

	public void setAspectBeanName(String aspectBeanName) {
		this.aspectBeanName = aspectBeanName;
	}

	@Override
	public void setBeanFactory(BeanFactory beanFactory) {
		this.beanFactory = beanFactory;
		Assert.notNull(this.aspectBeanName, "'aspectBeanName' is required");
	}

	@Override
	public Object getAspectInstance() {
		
		// 從 bean 工廠擷取切面執行個體
		return this.beanFactory.getBean(this.aspectBeanName);
	}

	// 略

}
           

很簡單的實作類,實作 BeanFactoryAware 接口,以 beanName 的形式從 beanFactory 擷取切面執行個體。

SimpleAspectInstanceFactory

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;
	}

	@Override
	public final Object getAspectInstance() {
		try {
			return ReflectionUtils.accessibleConstructor(this.aspectClass).newInstance();
		}
		 
		// ...
		
	}

	// ...

}
           

直接通過反射擷取,相當于

new

了一個切面執行個體

MetadataAwareAspectInstanceFactory

public interface MetadataAwareAspectInstanceFactory extends AspectInstanceFactory {

	// 切面中繼資料的擷取
	AspectMetadata getAspectMetadata();

	@Nullable
	Object getAspectCreationMutex();

}
           

十分重要的一個類,核心在于 AspectMetadata 切面中繼資料的維護,封裝了切面的中繼資料資訊

SingletonAspectInstanceFactory

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;
	}

	@Override
	public final Object getAspectInstance() {
		return this.aspectInstance;
	}

	// 略

}
           

儲存了一個單例,對于擷取執行個體請求,直接傳回該單例對象

SimpleMetadataAwareAspectInstanceFactory

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);
	}

	@Override
	public final AspectMetadata getAspectMetadata() {
		return this.metadata;
	}

	// 略

}
           

在 SimpleAspectInstanceFactory 的基礎上實作 MetadataAwareAspectInstanceFactory ,拓展了對 AspectMetadata 的操作

SingletonMetadataAwareAspectInstanceFactory

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);
	}

	// 略

}
           

在 SingletonAspectInstanceFactory 的基礎上實作 MetadataAwareAspectInstanceFactory ,拓展了對 AspectMetadata 的操作

BeanFactoryAspectInstanceFactory

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;
		
		// 如果沒有傳入 type ,則從 beanFactory 擷取
		Class<?> resolvedType = type;
		if (type == null) {
			resolvedType = beanFactory.getType(name);
			Assert.notNull(resolvedType, "Unresolvable bean type - explicitly specify the aspect class");
		}
		this.aspectMetadata = new AspectMetadata(resolvedType, name);
	}

	// 基于 beanFactory 擷取 Aspect 執行個體
	@Override
	public Object getAspectInstance() {
		return this.beanFactory.getBean(this.name);
	}

	// ...

}
           

基于 bean工廠 維護中繼資料,擷取 Aspect 執行個體。實際上 Spring 擷取 AspectJ 執行個體就是使用這個類

LazySingletonAspectInstanceFactoryDecorator

public class LazySingletonAspectInstanceFactoryDecorator implements MetadataAwareAspectInstanceFactory, Serializable {

	// 接收傳入一個 MetadataAwareAspectInstanceFactory 
	private final MetadataAwareAspectInstanceFactory maaif;

	// 緩存執行個體
	@Nullable
	private volatile Object materialized;

	public LazySingletonAspectInstanceFactoryDecorator(MetadataAwareAspectInstanceFactory maaif) {
		Assert.notNull(maaif, "AspectInstanceFactory must not be null");
		this.maaif = maaif;
	}

	// 從傳入的 MetadataAwareAspectInstanceFactory 擷取并緩存
	@Override
	public 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;
	}

	// ...

}
           

裝飾者模型,相當于做了一層“緩存”包裝以保證執行個體隻被初始化一次

類圖

【源碼】Spring AOP 6 AspectInstanceFactory前言AspectInstanceFactory類圖總結

總結

該章節介紹 AspectInstanceFactory,主要負責解析 Aspect 對應的示例。

上一篇:【源碼】Spring AOP 5 Advisor

下一篇:【源碼】Spring AOP 7 AspectJAdvisorFactory