Spring 標籤解析——

在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;                                                                                         
}                                                                                                        
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章