【源碼】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 中解耦出來。

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;
}
// ...
}
裝飾者模型,相當于做了一層“緩存”包裝以保證執行個體隻被初始化一次
類圖
總結
該章節介紹 AspectInstanceFactory,主要負責解析 Aspect 對應的示例。
上一篇:【源碼】Spring AOP 5 Advisor
下一篇:【源碼】Spring AOP 7 AspectJAdvisorFactory