springAOP入口之AopNamespaceHandler.docx
- 文档编号:15859511
- 上传时间:2023-07-08
- 格式:DOCX
- 页数:22
- 大小:20.86KB
springAOP入口之AopNamespaceHandler.docx
《springAOP入口之AopNamespaceHandler.docx》由会员分享,可在线阅读,更多相关《springAOP入口之AopNamespaceHandler.docx(22页珍藏版)》请在冰点文库上搜索。
springAOP入口之AopNamespaceHandler
springAOP入口之AopNamespaceHandler
我们从spring.handlers入口开始看:
http\:
//www.springframework.org/schema/aop=org.springframework.aop.config.AopNamespaceHandler
1
打开类AopNamespaceHandler,代码如下:
packageorg.springframework.aop.config;
importorg.springframework.aop.aspectj.AspectJExpressionPointcut;
importorg.springframework.beans.factory.xml.BeanDefinitionParser;
importorg.springframework.beans.factory.xml.NamespaceHandlerSupport;
/**
*{@codeNamespaceHandler}forthe{@codeaop}namespace.
*
*
Providesa{@linkorg.springframework.beans.factory.xml.BeanDefinitionParser}forthe
*{@code<aop:
config>}tag.A{@codeconfig}tagcanincludenested
*{@codepointcut},{@codeadvisor}and{@codeaspect}tags.
*
*
The{@codepointcut}tagallowsforcreationofnamed
*{@linkAspectJExpressionPointcut}beansusingasimplesyntax:
*
*<aop:
pointcutid="getNameCalls"expression="execution(**..ITestBean.getName(..))"/>
*
*
*
Usingthe{@codeadvisor}tagyoucanconfigurean{@linkorg.springframework.aop.Advisor}
*andhaveitappliedtoallrelevantbeansinyou{@linkorg.springframework.beans.factory.BeanFactory}
*automatically.The{@codeadvisor}tagsupportsbothin-lineandreferenced
*{@linkorg.springframework.aop.PointcutPointcuts}:
*
*
*<aop:
advisorid="getAgeAdvisor"
*pointcut="execution(**..ITestBean.getAge(..))"
*advice-ref="getAgeCounter"/>
*
*<aop:
advisorid="getNameAdvisor"
*pointcut-ref="getNameCalls"
*advice-ref="getNameCounter"/>
*
*@authorRobHarrop
*@authorAdrianColyer
*@authorJuergenHoeller
*@since2.0
*/
publicclassAopNamespaceHandlerextendsNamespaceHandlerSupport{
/**
*Registerthe{@linkBeanDefinitionParserBeanDefinitionParsers}forthe
*'{@codeconfig}','{@codespring-configured}','{@codeaspectj-autoproxy}'
*and'{@codescoped-proxy}'tags.
*/
@Override
publicvoidinit(){
//In2.0XSDaswellasin2.1XSD.
registerBeanDefinitionParser("config",newConfigBeanDefinitionParser());
registerBeanDefinitionParser("aspectj-autoproxy",newAspectJAutoProxyBeanDefinitionParser());
registerBeanDefinitionDecorator("scoped-proxy",newScopedProxyBeanDefinitionDecorator());
//Onlyin2.0XSD:
movedtocontextnamespaceasof2.1
registerBeanDefinitionParser("spring-configured",newSpringConfiguredBeanDefinitionParser());
}
}
根据注释,该类是aop命名空间的处理类。
利用BeanDefinitionParser解析aop:
config标签,该标签包括pointcut、advisor、aspect标签。
pointcut标签允许创建AspectJExpressionPointcut,利用简单的语法:
pointcutid="getNameCalls"expression="execution(**..ITestBean.getName(..))"/> 1 使用advisor标签能够配置org.springframework.aop.Advisor,并且能自动应用的bean对象中。 advisor标签支持内联定义的或者引用的org.springframework.aop.PointcutPointcuts: advisorid="getAgeAdvisor" pointcut="execution(**..ITestBean.getAge(..))" advice-ref="getAgeCounter"/> advisorid="getNameAdvisor" pointcut-ref="getNameCalls" advice-ref="getNameCounter"/> 再看AopNamespaceHandler的类结构图: image 接口NamespaceHandler 先上源码: packageorg.springframework.beans.factory.xml; importorg.w3c.dom.Element; importorg.w3c.dom.Node; importorg.springframework.beans.factory.config.BeanDefinition; importorg.springframework.beans.factory.config.BeanDefinitionHolder; /** *Baseinterfaceusedbythe{@linkDefaultBeanDefinitionDocumentReader} *forhandlingcustomnamespacesinaSpringXMLconfigurationfile. * * Implementationsareexpectedtoreturnimplementationsofthe *{@linkBeanDefinitionParser}interfaceforcustomtop-leveltagsand *implementationsofthe{@linkBeanDefinitionDecorator}interfacefor *customnestedtags. * * Theparserwillcall{@link#parse}whenitencountersacustomtag *directlyunderthe{@code<beans>}tagsand{@link#decorate}when *itencountersacustomtagdirectlyundera{@code<bean>}tag. * * Developerswritingtheirowncustomelementextensionstypicallywill *notimplementthisinterfacedirectly,butrathermakeuseoftheprovided *{@linkNamespaceHandlerSupport}class. * *@authorRobHarrop *@authorErikWiersma *@since2.0 *@seeDefaultBeanDefinitionDocumentReader *@seeNamespaceHandlerResolver */ publicinterfaceNamespaceHandler{ /** *Invokedbythe{@linkDefaultBeanDefinitionDocumentReader}after *constructionbutbeforeanycustomelementsareparsed. *@seeNamespaceHandlerSupport#registerBeanDefinitionParser(String,BeanDefinitionParser) */ voidinit(); /** *Parsethespecified{@linkElement}andregisteranyresulting *{@linkBeanDefinitionBeanDefinitions}withthe *{@linkorg.springframework.beans.factory.support.BeanDefinitionRegistry} *thatisembeddedinthesupplied{@linkParserContext}. * Implementationsshouldreturntheprimary{@codeBeanDefinition} *thatresultsfromtheparsephaseiftheywishtobeusednested *inside(forexample)a{@code<property>}tag. * Implementationsmayreturn{@codenull}iftheywill *notbeusedinanestedscenario. *@paramelementtheelementthatistobeparsedintooneormore{@codeBeanDefinitions} *@paramparserContexttheobjectencapsulatingthecurrentstateoftheparsingprocess *@returntheprimary{@codeBeanDefinition}(canbe{@codenull}asexplainedabove) */ BeanDefinitionparse(Elementelement,ParserContextparserContext); /** *Parsethespecified{@linkNode}anddecoratethesupplied *{@linkBeanDefinitionHolder},returningthedecorateddefinition. * The{@linkNode}maybeeitheran{@linkorg.w3c.dom.Attr}oran *{@linkElement},dependingonwhetheracustomattributeorelement *isbeingparsed. * Implementationsmaychoosetoreturnacompletelynewdefinition, *whichwillreplacetheoriginaldefinitionintheresulting *{@linkorg.springframework.beans.factory.BeanFactory}. * Thesupplied{@linkParserContext}canbeusedtoregisterany *additionalbeansneededtosupportthemaindefinition. *@paramsourcethesourceelementorattributethatistobeparsed *@paramdefinitionthecurrentbeandefinition *@paramparserContexttheobjectencapsulatingthecurrentstateoftheparsingprocess *@returnthedecorateddefinition(toberegisteredintheBeanFactory), *orsimplytheoriginalbeandefinitionifnodecorationisrequired. *A{@codenull}valueisstrictlyspeakinginvalid,butwillbeleniently *treatedlikethecasewheretheoriginalbeandefinitiongetsreturned. */ BeanDefinitionHolderdecorate(Nodesource,BeanDefinitionHolderdefinition,ParserContextparserContext); } 该接口是供处理spring的xml配置文件类DefaultBeanDefinitionDocumentReader使用的基接口。 实现类需要返回顶级标签和BeanDefinitionDecorator定义的内嵌标签的实现。 该解析器在遇到自定义的bean标签时会调用parse()和decorate()方法. 抽象类NamespaceHandlerSupport 源码如下: packageorg.springframework.beans.factory.xml; importjava.util.HashMap; importjava.util.Map; importorg.w3c.dom.Attr; importorg.w3c.dom.Element; importorg.w3c.dom.Node; importorg.springframework.beans.factory.config.BeanDefinition; importorg.springframework.beans.factory.config.BeanDefinitionHolder; /** *实现了NamespaceHandlers的支持类,通过BeanDefinitionParser和BeanDefinitionDecorator的策略接口解析和装饰 *提供了相应的方法注册解析器去处理具体的元素 */ publicabstractclassNamespaceHandlerSupportimplementsNamespaceHandler{ /** *保存BeanDefinitionParser的实现 */ privatefinalMap newHashMap /** *保存BeanDefinitionDecorator的实现 */ privatefinalMap newHashMap /** *根据属性保存BeanDefinitionDecorator的实现 */ privatefinalMap newHashMap /** *解析Element元素并注册 */ @Override publicBeanDefinitionparse(Elementelement,ParserContextparserContext){ returnfindParserForElement(element,parserContext).parse(element,parserContext); } /** *根据Element查找注册的BeanDefinitionParser */ privateBeanDefinitionParserfindParserForElement(Elementelement,ParserContextparserContext){ StringlocalName=parserContext.getDelegate().getLocalName(element); BeanDefinitionParserparser=sers.get(localName); if(parser==null){ parserContext.getReaderContext().fatal( "CannotlocateBeanDefinitionParserforelement["+localName+"]",element); } returnparser; } /** *装饰代理的BeanDefinitionDecorator,被注册用来处理Node */ @Override publicBeanDefinitionHolderdecorate( Nodenode,BeanDefinitionHolderdefinition,ParserContextparserContext){ returnfindDecoratorForNode(node,parserContext).decorate(node,definition,parserContext); } /** *从注册的实现类找出BeanDefinitionParser,支持Element(s)和Attr(s) */ privateBeanDefinitionDecoratorfindDecoratorForNode(Nodenode,ParserContextparserContext){ BeanDefinitionDecoratordecorator=null; StringlocalName=parserContext.getDelegate().getLocalName(node); if(nodeinstanceofElement){ decorator=this.decorators.get(localName); } elseif(nodeinstanceofAttr){ decorator=this.attributeDecorators.get(localName); } else{ parserContext.getReaderContext().fatal( "CannotdecoratebasedonNodesoftype["+node.getClass().getName()+"]",node); } if(decorator==null){ parserContext.getReaderContext().fatal("CannotlocateBeanDefinitionDecoratorfor"+ (nodeinstanceofElement? "element": "attribute")+"["+localName+"]",node); } returndecorator; } /** *子类调用注册BeanDefinitionParser来处理具体的元素 */ protectedfinalvoidregisterBeanDefinitio
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- springAOP 入口 AopNamespaceHandler