在xml定義的Aop相關的bean一般是像這樣:
<aop:aspectj-autoproxy proxy-target-class="true" />
<bean id="afterUpdateBlHandler" class="com.citic.sggljg.ctrl.xxjg.AfterUpdateBlHandler"/>
<aop:config >
<aop:pointcut id="pointCutMethods" expression="execution(* com.citic.sggljg.ctrl.xxjg.Jgyj*.update(..))" />
<aop:aspect id="aspect_afterupdate" ref="afterUpdateBlHandler" >
<aop:after method="afterUpdate" pointcut-ref="pointCutMethods" />
<aop:before method=""/>
</aop:aspect>
</aop:config>
在java類中的各個標籤對應的解析類如圖:
下面我們就依次解析各個標籤。
- aop:aspectj-autoproxy
這個標籤的配置一般是這樣的<aop:aspectj-autoproxy proxy-target-class="true"/>
。對應的解析類是AspectJAutoProxyBeanDefinitionParser,下面的重點就是研究這個類源碼。
代碼很簡單,就是往bean工廠註冊一個類AnnotationAwareAspectJAutoProxyCreator,在工廠中的名稱是org.springframework.aop.config.internalAutoProxyCreator。
public BeanDefinition parse(Element element, ParserContext parserContext) {
AopNamespaceUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(parserContext, element);
extendBeanDefinition(element, parserContext);
return null;
}
- aop:config
對應的解析類是ConfigBeanDefinitionParser,看具體的解析過程:
public BeanDefinition parse(Element element, ParserContext parserContext) {
CompositeComponentDefinition compositeDef =
new CompositeComponentDefinition(element.getTagName(), parserContext.extractSource(element));
parserContext.pushContainingComponent(compositeDef);
//註冊AspectJAwareAdvisorAutoProxyCreator到工廠
configureAutoProxyCreator(parserContext, element);
List<Element> childElts = DomUtils.getChildElements(element);
for (Element elt: childElts) {//得到子類標籤 <aop:pointcut
String localName = parserContext.getDelegate().getLocalName(elt);
// <aop:pointcut id="txPointcut" expression="execution(* cn.javass..service..*.*(..))" />
//會將上面的標籤解析爲 AspectJExpressionPointcut 類的切口
if (POINTCUT.equals(localName)) {
parsePointcut(elt, parserContext);
}
// <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
//解析爲DefaultBeanFactoryPointcutAdvisor對象
else if (ADVISOR.equals(localName)) {
parseAdvisor(elt, parserContext);
}
else if (ASPECT.equals(localName)) {
parseAspect(elt, parserContext);
}
}
parserContext.popAndRegisterContainingComponent();
return null;
}