【源码】Spring AOP 6 AspectInstanceFactory
前言
此章节介绍 AspectInstanceFactory ,该组类主要用于从给定的类(或者 beanName 等)获取一个切面实例
AspectInstanceFactory
public interface AspectInstanceFactory extends Ordered {
// 创建切面实例
Object getAspectInstance();
// 暴露切面的类加载器
@Nullable
ClassLoader getAspectClassLoader();
}
顶层接口,解析 Aspect 切面实例的工厂,将切面解析的工作从 Spring AOP 中解耦出来
SingletonAspectInstanceFactory
public class SingletonAspectInstanceFactory implements AspectInstanceFactory, Serializable {
private final Object aspectInstance;
public SingletonAspectInstanceFactory(Object aspectInstance) {
this.aspectInstance = aspectInstance;
}
@Override
public final Object getAspectInstance() {
return this.aspectInstance;
}
// ...
}
最简单的实现,就维护一个 单例
对象
SimpleAspectInstanceFactory
public class SimpleAspectInstanceFactory implements AspectInstanceFactory {
private final Class<?> aspectClass;
public SimpleAspectInstanceFactory(Class<?> aspectClass) {
this.aspectClass = aspectClass;
}
@Override
public final Object getAspectInstance() {
try {
return ReflectionUtils.accessibleConstructor(this.aspectClass).newInstance();
}
// ...
}
// ...
}
根据给定的切面类型,直接通过反射 new
一个实例返回
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;
}
@Override
public Object getAspectInstance() {
// 从 bean 工厂获取切面实例
return this.beanFactory.getBean(this.aspectBeanName);
}
// 略
}
SimpleBeanFactoryAwareAspectInstanceFactory
实现了BeanFactoryAware
,所以可以跟Spring
容器有互动了- 切面实例基于给定的
aspectBeanName
从容器中获取,这种模式在Spring
中也很常见
MetadataAwareAspectInstanceFactory
public interface MetadataAwareAspectInstanceFactory extends AspectInstanceFactory {
// 切面元数据的获取
AspectMetadata getAspectMetadata();
@Nullable
Object getAspectCreationMutex();
}
MetadataAwareAspectInstanceFactory
接口拓展了对AspectMetadata
的维护AspectMetadata
是切面元数据信息的封装
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;
}
// 略
}
主要就是对 AspectMetadata
的维护:this.metadata = new AspectMetadata(aspectClass, aspectName);
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);
}
// 略
}
同理,主要就是对 AspectMetadata
的维护:this.metadata = new AspectMetadata(aspectClass, aspectName);
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) {
this.beanFactory = beanFactory;
this.name = name;
// 如果没有传入 type ,则从 beanFactory 获取
Class<?> resolvedType = type;
if (type == null) {
resolvedType = beanFactory.getType(name);
}
this.aspectMetadata = new AspectMetadata(resolvedType, name);
}
// 基于 beanFactory 获取 Aspect 实例
@Override
public Object getAspectInstance() {
return this.beanFactory.getBean(this.name);
}
// ...
}
- 同理,主要就是对
AspectMetadata
的维护:this.metadata = new AspectMetadata(aspectClass, aspectName);
- 如果可以不传类型,当然可以从容器中获取
示例 demo
public class AspectInstanceFactoryDemo {
@Component
@Aspect
public static class MyAspect {
@Pointcut("execution(* com.example.springdemoall..*.a())")
public void pointcut() {
}
}
@Test
public void test() {
AnnotationConfigApplicationContext context
= new AnnotationConfigApplicationContext(MyAspect.class);
BeanFactoryAspectInstanceFactory beanFactoryAspectInstanceFactory
= new BeanFactoryAspectInstanceFactory(context, "aspectInstanceFactoryDemo.MyAspect");
// 跟容器中的切面实例是同一个
MyAspect aspectInstance
= (MyAspect) beanFactoryAspectInstanceFactory.getAspectInstance();
System.out.println(aspectInstance == context.getBean(MyAspect.class));
// 可以解析 AspectMetadata
AspectMetadata aspectMetadata
= beanFactoryAspectInstanceFactory.getAspectMetadata();
}
}
- 通过
BeanFactoryAspectInstanceFactory
获取容器中的切面示例 - 同时可以解析
AspectMetadata
LazySingletonAspectInstanceFactoryDecorator
public class LazySingletonAspectInstanceFactoryDecorator implements MetadataAwareAspectInstanceFactory, Serializable {
// 被装饰者
private final MetadataAwareAspectInstanceFactory maaif;
// 缓存实例,延迟加载
@Nullable
private volatile Object materialized;
// 由 maaif 延迟加载并缓存
@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