Spring AOP的实现可以分为三大部分
1. 注册AOP功能具体实现类
2. 普通Bean实例化时AOP的切入
3. AOP切入具体流程
本文主要讲第一部分
1. 注册AOP功能具体实现类
1.1 初始化aop自定义标签解析器 AspectJAutoProxyBeanDefinitionParser
当 xml 中读到 aop:aspectj-autoproxy 的字段,自动注册 AspectJAutoProxyBeanDefinitionParser
protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate){
if (delegate.isDefaultNamespace(root)) {
if (delegate.isDefaultNamespace(ele)) {
parseDefaultElement(ele, delegate);
} else {
// aop xml配置进入此处,共分为两步
// 1. 获取aop的解析器 2. 使用解析器,注册aop的实现类
delegate.parseCustomElement(ele);
}
} else {
delegate.parseCustomElement(root);
}
}
// delegate具体实现类BeanDefinitionParserDelegate
public BeanDefinition parseCustomElement(Element ele) {
return parseCustomElement(ele, null);
}
public BeanDefinition parseCustomElement(Element ele, BeanDefinition containingBd) {
String namespaceUri = getNamespaceURI(ele);
// resolve() 方法会返回具体处理的handler,
// handler初始化, 即aop标签解析器的注册就是在里面完成的
NamespaceHandler handler = this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri);
// 1.2会对此做详细介绍,调用aop解析器的parse方法,完成aop功能类bean的注册
return handler.parse(ele, new ParserContext(this.readerContext, this, containingBd));
}
public NamespaceHandler resolve(String namespaceUri) {
// namespaceUri = "http://www.springframework.org/schema/aop"
// handlerOrClassName = "org.springframework.aop.config.AopNamespaceHandler"
Map<String, Object> handlerMappings = getHandlerMappings();
Object handlerOrClassName = handlerMappings.get(namespaceUri);
......
Class<?> handlerClass = ClassUtils.forName(className, this.classLoader);
NamespaceHandler namespaceHandler = (NamespaceHandler) BeanUtils.instantiateClass(handlerClass);
// namespaceHandler为 AopNamespaceHandler, 调用handler初始化init()
namespaceHandler.init();
......
}
// 最终注册处理aop解析器 AspectJAutoProxyBeanDefinitionParser
AopNamespaceHandler.init(){
registerBeanDefinitionParser("aspectj-autoproxy", new AspectJAutoProxyBeanDefinitionParser());
}
1.2 解析器进行解析,AspectJAutoProxyBeanDefinitionParser是BeanDefinitionParser子类,在最终parse过程中,其parse()函数最终会注册AnnotationAwareAspectJAutoProxyCreator(此类是aop的功能实现类),最终AnnotationAwareAspectJAutoProxyCreator对象转换为 RootBeanDefinition对象,进入Ioc container
// 1.1中的解析函数,继续分析
public BeanDefinition parseCustomElement(Element ele, BeanDefinition containingBd) {
String namespaceUri = getNamespaceURI(ele);
// resolve() 方法会返回具体处理的handler,
// handler初始化, 即aop标签解析器的注册就是在里面完成的
NamespaceHandler handler = this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri);
// 1.2会对次做详细介绍,调用aop解析器的parse方法,完成aop功能类bean的注册
return handler.parse(ele, new ParserContext(this.readerContext, this, containingBd));
}
// AspectJAutoProxyBeanDefinitionParser
public BeanDefinition parse(Element element, ParserContext parserContext) {
AopNamespaceUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(parserContext, element);
extendBeanDefinition(element, parserContext);
return null;
}
// AopNamespaceUtils
public static BeanDefinition registerAspectJAnnotationAutoProxyCreatorIfNecessary(BeanDefinitionRegistry registry, Object source) {
return registerOrEscalateApcAsRequired(AnnotationAwareAspectJAutoProxyCreator.class, registry, source);
}
private static BeanDefinition registerOrEscalateApcAsRequired(Class<?> cls, BeanDefinitionRegistry registry, Object source) {
// 初始化bean, aop的实现类AnnotationAwareAspectJAutoProxyCreator进行实例化,
// 封装为RootBeanDefinition, 进入Ioc容器, registry 实际是 DefaultListableBeanFactory
RootBeanDefinition beanDefinition = new RootBeanDefinition(cls);
beanDefinition.setSource(source); beanDefinition.getPropertyValues().add(""order"", Ordered.HIGHEST_PRECEDENCE);
beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
registry.registerBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME, beanDefinition);
return beanDefinition;
}