阅读更多

8顶
1踩

编程语言

原创新闻 为GWT增加AOP支持,GWTENT 0.5发布

2008-11-24 12:30 by 见习记者 Camel_java 评论(3) 有7236人浏览
  GWTENT 0.5 发布,在新的版本中不仅仅增强对反射的支持,重要的是为GWT客户端代码提供一个AOP实现。

  项目主页:http://code.google.com/p/gwt-ent/
  下载页:http://code.google.com/p/gwt-ent/downloads/list
  AOP WIKI 页:http://code.google.com/p/gwt-ent/wiki/AOP

  连接点同时支持AspectJ注解风格与Google Guice Matcher类,所有连接点匹配与Matcher类都只运行在HostModel与编译期,这也意味着你可以使用所有JAVA类而不受GWT客户端代码限制,同时这些代码不会在最终的目标JavaScript代码里出现。

  通知(Advice)支持以下五种:
  • 前置通知(Before advice):在某连接点之前执行的通知,但这个通知不能阻止连接点之前的执行流程(除非它抛出一个异常)。
  • 后置通知(After returning advice):在某连接点正常完成后执行的通知:例如,一个方法没有抛出任何异常,正常返回。
  • 异常通知(After throwing advice):在方法抛出异常退出时执行的通知。
  • 最终通知(After (finally) advice):当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。
  • 环绕通知(Around Advice):包围一个连接点的通知,如方法调用。这是最强大的一种通知类型。环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它自己的返回值或抛出异常来结束执行。



使用方法

使用方法非常简单
public void testAOP(){
        Phone phone = (Phone) GWT.create(Phone.class);
        Receiver auntJane = phone.call(123456789);
        System.out.println(auntJane);
  }


切面类
使用@Aspect声明
        @Aspect
        public static class PhoneLoggerInterceptor {
                
                //execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)
                @Before("execution(* com.gwtent.client.test.aop.Phone.call(java.lang.Number))")
                public void beforeCall(MethodInvocation invocation) {
                        for (Object arg : invocation.getArguments()){
                                System.out.println("Do something in PhoneLoggerInterceptor, Before...");
                                
                                if (arg instanceof Number)
                                        System.out.println("Call to: " + arg);
                        }
                }
                
                @AfterReturning(pointcut = "execution(* com.gwtent.client.test.aop.Phone.call(java.lang.Number))",
                        returning = "returnValue")
                public void afterReturningCall(MethodInvocation invocation, Object returnValue) {
                        System.out.println("Do something in PhoneLoggerInterceptor, AfterReturning...");
                        
                        if ((returnValue != null)){
                                if (returnValue instanceof Number)
                                        System.out.println("Returning Number: " + returnValue.toString());
                                else
                                        System.out.println("Returning Object: " + returnValue.toString());
                        }else{
                                System.out.println("Returning Object is NULL?");
                        }
                }
                
                @After("execution(* com.gwtent.sample.client.Phone.call(java.lang.Number))")
                public void afterCall(MethodInvocation invocation) {                            
                        for (Object arg : invocation.getArguments()){
                                System.out.println("Do something in PhoneLoggerInterceptor, After...");
                                
                                if (arg instanceof Number)
                                        System.out.println("After Call: " + arg);
                        }
                }
        }



        @Aspect
        public static class PhoneRedirectInterceptor {
                
                @Around("execution(* com.gwtent.client.test.aop.Phone.call(java.lang.Number))")
                public Object invoke(MethodInvocation invocation) throws Throwable {
                        invocation.proceed();
                        System.out.println("Do something in PhoneRedirectInterceptor...");
                        return new Receiver("Alberto's Pizza Place");
                }
        }


需要被增强的类
public class Phone implements Aspectable {
        private static final Map<Number, Receiver> RECEIVERS = new HashMap<Number, Receiver>();

        static {
                RECEIVERS.put(123456789, new Receiver("Aunt Jane"));
                RECEIVERS.put(111111111, new Receiver("Santa"));
        }
        
        /**
         * the phone number, like your home number
         */
        private Number number;

        public Receiver call(Number number) {
                System.out.println("The call here...");
                Receiver result = RECEIVERS.get(number);
                if (result != null)
                        return result;
                else
                        throw new NumberNotFoundException("Can't  found receiver, number: " + number);
        }
        
        public Receiver call(String number){
                System.out.println("The call here...");
                return RECEIVERS.get(111111111);
        }
        
        public String toString(){
                return super.toString();
        }
        

        public void setNumber(Number number) {
                this.number = number;
        }

        public Number getNumber() {
                return number;
        }
        
        public static class NumberNotFoundException extends RuntimeException{

                /**
                 * 
                 */
                private static final long serialVersionUID = 1L;
                
                public NumberNotFoundException(String msg){
                        super(msg);
                }
                
        }


        public static class Receiver {
                private final String name;

                public Receiver(String name) {
                        this.name = name;
                }

                @Override
                public String toString() {
                        return getClass().getName() + "[name=" + name + "]";
                }
        }



输出结果

Do something in PhoneLoggerInterceptor, Before...
Call to: 123456789
Validate, you cann't dail to 0, current Number(most time it's null): null
The call here...
Do something in PhoneRedirectInterceptor...
Do something in PhoneLoggerInterceptor, After...
After Call: 123456789
Do something in PhoneLoggerInterceptor, AfterReturning...
Returning Object: com.gwtent.sample.client.Phone$Receiver[name=Alberto's Pizza Place]
com.gwtent.sample.client.Phone$Receiver[name=Alberto's Pizza Place]
8
1
评论 共 3 条 请登录后发表评论
3 楼 cjiaj1982 2010-06-23 21:51
gwt 增加AOP的作用在哪里呢?
2 楼 arpenker 2009-02-16 14:53
DEMO无法运行。缺少com.gwtent.sample.client.Phone.Receiver
1 楼 Camel_java 2008-11-24 12:53
从第一个帖子:http://camel-java.javaeye.com/blog/153661
到现在断断续续终于发布版本0.5,项目有着很多的缺陷不足,但是会一直进行下去。
哪怕能为开发者提升1%的开发进度,减少1%的使用难道,都是胜利。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • ECSide标签

    NULL 博文链接:https://tanglichun.iteye.com/blog/1485890

  • ECSide列表宽度问题

    这几天做项目的时候,遇到一个问题。(list展示使用的是ECSide)当某一列值太长时,会把别的列挤压,导致页面样式很难看。后来,试了很多办法,终于搞定(还不是很完美)。在中加入style="table-layout:fixed;"(或...

  • Java_Side.zip_ecside

    ECSide 文档,当前Ajax开源框架的一种,具有更好的数据展现。

  • ecside源码

    ecside源码

  • ecside介绍:

    NULL 博文链接:https://tanglichun.iteye.com/blog/1488656

  • ecside.jar

    ecside2.0RC1项目包,引入即可运行,无需额外的jar包。 ECSide是有一个基于jsp tag的开源列表组件.

  • ecside 列表排序问题

    ecside列表首先点击某一列排序,没有问题,再点第二列的时候没有起作用。原因是第二次排序的时候还包含着第一次排序的字段。所以排序始终是第一次的排序结果。 修改ecside.js 的ECSideUtil.doSort方法 在 if ...

  • 解决ecside导出文件乱码问题

    解决ecside导出PDF时中文乱码所需的文件,放在工程lib目录下,这是一些字体文件,出现乱码的原因是系统找不到对应的字体定义文件所至

  • ecside

    ecside 的使用

  • ecside所需jar包

    整理的ecside所需jar包: avalon-framework-4.0.jar batik-1.5-fop-0.20-5.jar commons-beanutils-bean-collections.jar commons-beanutils-core.jar commons-beanutils.jar commons-codec-...

  • ecside2.0RC1项目包

    ecside2.0RC1项目包,引入即可运行,无需额外的jar包。 ECSide是有一个基于jsp tag的开源列表组件. 简单的说,它就是一组可以帮助你快速实现强大的列表的jsp标签. 它的工作原理很简单. 您将要展现的列表的数据集合...

  • ECSide标签属性说明.pdf

    ◆ 属性: tableId ...设置列表的唯一标识,默认为"ec",当一个页面内有多个 ECSIDE 列表时,必须为每个列表指定不同的 tableId. ◆ 属性: theme 描述: 设置列表的风格所使用的主题. 默认为 ecside.

  • ecside 文 档

    ecside 文档ecside 文档ecside 文档ecside 文档ecside 文档ecside 文档ecside 文档ecside 文档ecside 文档ecside 文档ecside 文档ecside 文档ecside 文档ecside 文档ecside 文档ecside 文档ecside 文档ecside 文档...

  • Web项目所需ecside全部文件

    Web项目所需ecside全部文件 包括jar包、js、css等

  • 基于FPGA的四相八拍步进电机控制系统设计:集成交付、正反转、加速减速及调速功能

    内容概要:本文详细介绍了基于FPGA的四相八拍步进电机控制系统的开发过程。主要内容包括:1. 使用VHDL和Verilog编写LED显示屏驱动代码,用于显示角度、学号和姓名等信息;2. 实现步进电机的正反转控制,通过状态机管理相序变化;3. 开发加速减速控制模块,确保电机启动和停止时的平稳性;4. 设计调速功能,通过调节脉冲频率实现速度控制。此外,文中还讨论了调试过程中遇到的问题及其解决方案。 适合人群:对FPGA开发和步进电机控制感兴趣的电子工程师、嵌入式系统开发者以及相关专业的学生。 使用场景及目标:适用于需要高精度运动控制的应用场合,如工业自动化、机器人技术和精密仪器等领域。目标是帮助读者掌握FPGA控制步进电机的基本原理和技术细节。 其他说明:文中提供了详细的代码片段和调试经验分享,有助于读者更好地理解和应用所学知识。同时,作者还提到了一些实用技巧,如通过PWM调节实现多级变速,以及如何避免步进电机的共振问题。

  • Android开发:基于SQLite的日历备忘录记事本项目详解与实现

    内容概要:本文详细介绍了基于Android Studio开发的日历备忘录记事本项目,涵盖日历查看、添加备忘录、闹钟提醒和删除备忘录等功能。项目使用SQLite数据库进行数据存储,通过CalendarView、EditText、Button等控件实现用户交互,并利用AlarmManager和PendingIntent实现闹钟提醒功能。此外,项目还包括数据库的设计与管理,如创建DatabaseHelper类来管理数据库操作,确保数据的安全性和完整性。文章还探讨了一些常见的开发技巧和注意事项,如时间戳的使用、手势监听的实现等。 适用人群:适用于初学者和有一定经验的Android开发者,尤其是希望深入了解Android开发基础知识和技术细节的人群。 使用场景及目标:该项目旨在帮助开发者掌握Android开发的基本技能,包括UI设计、数据库操作、闹钟提醒机制等。通过实际项目练习,开发者能够更好地理解和应用这些技术,提升自己的开发能力。 其他说明:文中提到一些进阶任务,如用Room替换SQLite、增加分类标签、实现云端同步等,鼓励开发者进一步扩展和优化项目。同时,项目源码公开,便于学习和参考。

  • Matlab实现基于SVM-Adaboost支持向量机结合Adaboost集成学习时间序列预测的详细项目实例(含完整的程序,GUI设计和代码详解)

    内容概要:本文档详细介绍了一个基于SVM(支持向量机)和Adaboost集成学习的时间序列预测项目。该项目旨在通过结合这两种强大算法,提升时间序列预测的准确性和稳定性。文档涵盖了项目的背景、目标、挑战及其解决方案,重点介绍了模型架构、数据预处理、特征选择、SVM训练、Adaboost集成、预测与误差修正等环节。此外,文档还探讨了模型在金融市场、气象、能源需求、交通流量和医疗健康等多个领域的应用潜力,并提出了未来改进的方向,如引入深度学习、多任务学习、联邦学习等先进技术。 适合人群:具备一定机器学习基础的研究人员和工程师,特别是那些从事时间序列预测工作的专业人士。 使用场景及目标:①用于金融市场、气象、能源需求、交通流量和医疗健康等领域的复杂时间序列数据预测;②通过结合SVM和Adaboost,提升预测模型的准确性和稳定性;③处理噪声数据,降低计算复杂度,提高模型的泛化能力和实时预测能力。 其他说明:文档不仅提供了详细的理论解释,还附有完整的Matlab代码示例和GUI设计指导,帮助读者理解和实践。此外,文档还讨论了模型的部署与应用,包括系统架构设计、实时数据流处理、可视化界面、GPU加速推理等方面的技术细节。

  • #游戏之追逐奶酪123

    #游戏之追逐奶酪123

  • 威纶通触摸屏配方管理系统解析:宏程序、数据结构与UI设计

    内容概要:本文详细介绍了威纶通触摸屏配方管理系统的实现方法及其应用场景。首先,文章讲解了配方管理的基本概念和技术背景,强调了配方管理在工业自动化中的重要性。接着,通过具体的宏程序代码示例,展示了如何实现配方的保存、加载以及安全校验等功能。文中还提到配方数据结构的设计,如使用寄存器地址偏移来确保数据不冲突,并通过CSV文件格式方便地管理和维护配方数据。此外,文章深入探讨了UI设计方面的内容,包括动态图层技术和按钮交互效果的应用,使得用户界面更加友好和直观。最后,作者分享了一些实际项目中的经验和技巧,如文件操作的异常处理和宏指令调试方法。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对触摸屏配方管理系统感兴趣的读者。 使用场景及目标:适用于需要频繁切换设备参数的生产环境,如食品加工、注塑成型等行业。通过使用威纶通触摸屏配方管理系统,可以提高工作效率,减少人为错误,同时简化设备调试和维护流程。 其他说明:附带的工具包提供了完整的宏指令注释版、图库资源和调试工具,帮助用户更好地理解和应用该系统。

  • 张彩明-图形学简明教程 配书资源

    张彩明-图形学简明教程 PPT课件

Global site tag (gtag.js) - Google Analytics