通过nanocontainer的nanowar和其struts插件完美的实现了ioc模式的透明,但无法在标准的nanowar中引入nanoaop不得不说是一种遗憾。看了一下nanocontainer的代码,决定自己动手给nanowar添加aop的支持。要在组件和实例中支持aop,首先要引入interceptor chains。可以考虑在xml定义中引入<aspect interceptor=interceptorname pointcuts=filter/>标签。这个<aspect>标签与组件或实例的<parameter>标签在同一级别上。其中interceptor指出拦截器的名称。拦截器的实现可以通过标准组件方式在同一个配置文件中进行注册。pointcuts是拦截方法的过滤表达式(perl5的正则表达式,和nanoaop预定义几个过滤规则)。在nanowar中实现这个<aspect>标签,需要修改scopedcotainercomposer, xmlcontainerbuilder, containerrecorder, servletcontainerlistener, defaultlifecyclecontainerbuider类。由于拦截器无法在ioc容器初始化的过程中得到实例。因此,还需要引入一个新的通用拦截器类(interceptordelegate),作为真正的拦截器实例和需被拦截的组件的调用桥梁。由于对源代码改动量较大,索性就在原来类的前面加上aspectable前缀引入新的类,但除了aop部分,其他的保持不变。scopedcotainercomposer => aspectablescopedcontainercomposer.java public aspectablescopedcontainercomposer() throws classnotfoundexception { this(new dynaopaspectablepicocontainerfactory().createcontainer()); }xmlcontainerbuilder => aspectablexmlcontainerbuilder.javaprotected picocontainer createcontainerfromscript( …. aspectablepicocontainerfactory containerfactory = new dynaopaspectablepicocontainerfactory(); aspectablepicocontainer childcontainer = containerfactory .createcontainer(componentadapterfactory, parentcontainer); cuts = childcontainer.getpointcutsfactory(); ….} private void registercomponentimplementation(nanocontainer container, element element) throws classnotfoundexception, malformedurlexception { …… map interceptors = createinterceptors(element); …… if (interceptors != null) { registercomponentinterceptor(container, clazz, interceptors); } } ……. private void registercomponentinterceptor(nanocontainer container, class component, string pointcuts, string interceptorkey) { if (notset(pointcuts)) { pointcuts = all_methods; } if (container.getpico() instanceof aspectablepicocontainer) { aspectablepicocontainer aspectcontainer = (aspectablepicocontainer) container .getpico(); aspectcontainer.registerinterceptor(cuts.instancesof(component), getmethodpointcut(pointcuts), new interceptordelegate( aspectcontainer, interceptorkey)); } }……. private map createinterceptors(element element) { map interceptormap = new hashmap(); nodelist children = element.getchildnodes(); for (int i = 0; i < children.getlength(); i++) { if (children.item(i) instanceof element) { element childelement = (element) children.item(i); if (aspect.equals(childelement.getnodename())) { string interceptor = childelement.getattribute(interceptor); if (notset(interceptor)) throw new nanocontainermarkupexception("" + key + " attribute not specified for " + element.getnodename()); string pointcuts = childelement.getattribute(pointcuts); interceptormap.put(interceptor, pointcuts); } } } if (interceptormap.isempty()) return null; else return interceptormap; } private methodpointcut getmethodpointcut(string pointcuts) { if (object_methods.equals(pointcuts)) return cuts.objectmethods(); if (is_methods.equals(pointcuts)) return cuts.ismethods(); if (all_methods.equals(pointcuts)) return cuts.allmethods(); if (get_methods.equals(pointcuts)) return cuts.getmethods(); if (set_methods.equals(pointcuts)) return cuts.setmethods(); return cuts.signature(pointcuts); }containerrecorder => aspectablecontainerrecorder.java public mutablepicocontainer getcontainerproxy() { if (this.container instanceof aspectablepicocontainer) return (mutablepicocontainer) proxy.newproxyinstance(getclass().getclassloader(), new class[]{aspectablepicocontainer.class}, invocationrecorder); else return (mutablepicocontainer) proxy.newproxyinstance(getclass().getclassloader(), new class[]{mutablepicocontainer.class}, invocationrecorder); }defaultlifecyclecontainerbuider => aspectablelifecyclecontainerbuider.java protected picocontainer createcontainer(picocontainer parentcontainer, object assemblyscope) { aspectablepicocontainerfactory containerfactory = new dynaopaspectablepicocontainerfactory(); return containerfactory.createcontainer(parentcontainer); }servletcontainerlistener => aspectableservletcontainerlistener.javaprivate containerbuilder createbuilder(servletcontext context) throws classnotfoundexception { …… if (initparameter.equals(container_composer)) { containercomposer containercomposer = createcontainercomposer(context); return new aspectablelifecyclecontainerbuilder(containercomposer); }interceptordelegate .javaimport org.aopalliance.intercept.methodinterceptor;import org.aopalliance.intercept.methodinvocation;import org.picocontainer.picocontainer;import dynaop.interceptor;import dynaop.invocation;public class interceptordelegate implements interceptor, methodinterceptor { private picocontainer pico; private object key; public interceptordelegate(picocontainer pico, object key) { this.pico = pico; this.key = key; } /* (non-javadoc) * @see dynaop.interceptor#intercept(dynaop.invocation) */ public object intercept(invocation invocation) throws throwable { return ((interceptor)pico.getcomponentinstance(key)).intercept(invocation); } /* (non-javadoc) * @see org.aopalliance.intercept.methodinterceptor#invoke(org.aopalliance.intercept.methodinvocation) */ public object invoke(methodinvocation invocation) throws throwable { return ((methodinterceptor)pico.getcomponentinstance(key)).invoke(invocation); }}
在nanowar中引入AOP-JSP教程,Java技巧及代码
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 在nanowar中引入AOP-JSP教程,Java技巧及代码
相关推荐
- 暂无文章
