欢迎光临
我们一直在努力

在nanowar中引入AOP-JSP教程,Java技巧及代码

建站超值云服务器,限时71元/月

通过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);    }}

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 在nanowar中引入AOP-JSP教程,Java技巧及代码
分享到: 更多 (0)

相关推荐

  • 暂无文章