Spring 标签解析——<AOP>

在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;                                                                                         
}                                                                                                        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值