动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.在JBuilder9上使用Struts1.1的实.
.基于JDK5.0一些collection类的使.
.Java中类似于C语言中Sizeof功能实.
.JAVA虚拟机几个命令行参数说明.
.续“如何避免Microsoft非标准Jav.
.Java 3D 绘图性能.
.EJB设计模式3.
.试析J2EE与.NET时代的商业利润(转.
.彻底研究Java中的正则表达式.
.使用SQLMaps 进行对象关系映射.
.学习如何使 Java 应用程序启动更.
.浅论手机游戏发展趋势与相关 J2M.
.jboss配置mysql数据库连接池.
.用JAVA做数字签名.
.利用JAVA生成JPG缩略图.
.使用动态代理实现用AOP对数据库进.
.equals与“==”操作符的比较.
.用Java简单实现文件分割与合并.
.Java语言深入:对java.lang的研究.
.Web Services被列为今年IDC重点观.

面向方面编程AOP和JBoss(一)

发表日期:2008-1-5 |



  概述
  面向方面编程(ASPect-Oriented Programming, AOP)是一个令人兴奋的新模式。就开发软件系统而言,它的影响力将会和有15到20年的面向对象一样。面向方面编程和面向对象编程不但不是互相竞争的技术而且是可以很好的互补。面向对象编程主要用于为同一对象层次的公用行为建模。它的弱点是将公共行为应用于多个无关对象模型之间。而这恰恰是AOP适合的地方。AOP答应定义交叉的关系,那些关系应用于跨国分开的,非常不同的对象模型。AOP答应你层次化功能性而不是嵌入功能性,那使得代码有更好的可度性和易于维护性。我喜欢认为OOP是自上而下的软件开发,而AOP是自左而右的软件开发,它们是完全直交的技术,并且互相很好的补充。
  在OOP的工具里是继续,封装和多态,而AOP的组件是通知/拦截器,导言,元数据和pintcuts.让我们看一下这些定义。
  
  通知/拦截器
  一个通知是一个逻辑,这个逻辑有特定的事件触发。它是行为,这个行为能够被插入在调用者和被调用者之间,在一个方法调用者和实际的方法之间。通知是AOP真正的要害。通知答应你去透明的应用一些事物,像日志和记录到一个存在的对象模型。
  在 JBoss AOP中,我们用拦截器是实现了通知。你能够定义拦截器,它拦截方法调用,构造器调用和域访问。后面,我们将阐明怎样应用这些拦截器到一个存在的对象模型。
  
  导言
  导言是一个增加方法或者域到一个存在的类中的途径。它们甚至答应你改变当前存在的类是显的接口,并且引入一个混合的类,这个类是实现了新的接口。导言答应你带入多继续到一般的Java类。导言一个主要的用例是当你有一个方面,你想让这个方面有一个运行时间借口时。你想应用你的方面跨越不同的对象层次,但是你仍然要应用开发者去能够调用特定方面的APIs.
  Apple apple    = new Apple();
  LoggingAPI logging = (LoggingAPI)apple;
  Apple.setLoggingLevel(VERBOSE);
  导言能够是一个方法,它将一个新的API绑定到一个存在的对象模型。
  
  元数据
  元数据是能够绑定到一个类的附加信息,在静态或者运行时间。元数据更加有力力量的是,你能够动态绑定元数据到一个给定的对象实例。元数据非常强大的,当你真正编写应用于任何对象的一般方面,而逻辑需要知道制定类的信息时。在使用的一个好的元数据类比就是EJB规范。在EJB的XML发布描述符中,你需要定义基于每一个方法的事务属性。应用服务器指导什么时候,什么地方开始,挂起或者提交一个事务,因为你在BEAN的XML的配置文件中的元数据内已经定义如方法:Required,RequiresNew,Support等等,它们绑定在你的EJB类和事务治理之间。
  C#把元数据成为了这个语言的组成部分。XDoclet是另一个动作的元数据的例子。假如你曾经用过XDoclet生成过EJB文件和发布描述符,你就会知道元数据的力量。在JDK1.5中,当元数据被加入java语言中,JCP一致同意。(见JSR175)。尽管直到JSR175成为了事实,一个好的AOP框架也应该提供一种机制去定义在运行时间有效的类级元数据。
  
  Pointcuts
  假如拦截器,导言和元数据是AOP的特征,那么pointcuts就是粘合剂。Pointcuts告诉AOP框架,那些拦截器绑定到那些类, 什么原数据将应用于那些类或者那一个导言将被传入那些类。Pointcuts定义各种AOP特征将怎样应用于你应用中的类。
  
  在动作中的AOP
  例1.使用拦截器
  JBoss 4.0带了一个AOP框架。这个框架和JBoss应用服务器紧密地结合,但是你也能够在你的应用中,单独的运行它。直到你看了动作中看到它,你才会完全的理解这个概念,所以让我们用一个来自于JBoss AOP的例子,来说明这个模块所有的部分是如何一起工作的。在这章余下的部分,我们将建立一个例子来跟踪使用AOP的框架。
  
  定义一个拦截器
  为了实现我们对于框架的跟踪,我们必须作的第一件事是定义一个拦截器,它将作实际的工作。在JBOSS AOP中,所有的拦截器必须实现org.jboss.aop.Interceptor 接口。
  public interface Interceptor
  {
    public String getName();
    public InvocationResponse invoke(Invocation invocation) throws Throwable;
  }
  
  在JBoss AOP中,被拦截的所有域,构造器和方法被转成一般的invoke调用。方法的参数被填入一个Invocation对象,并且方法的返回值,域的存取或者构造器被填入一个InvocationResponse对象。这个Invocation对象也驱动这个拦截链。为了清楚地说明这个,让我们看一下,在这个例子中,所有的对象是如何配合到一起的。
  import org.jboss.aop.*;
  import java.lang.reflect.*;
  
  public class TracingInterceptor implements Interceptor
  {
    public String getName() { return TracingInterceptor; }
    public InvocationResponse invoke(Invocation invocation)
      throws Throwable
    {
     String message = null;
  
     if (invocation.getType() == InvocationType.METHOD)
     {
       Method method = MethodInvocation.getMethod(invocation);
       message    = method: + method.getName();
     }
     else if (invocation.getType() == InvocationType.CONSTRUCTOR)
     {
       Constructor c = ConstructorInvocation.getConstructor(invocation);
       message    = constructor: + c.toString();
     }
     else
     {
       // Do nothing for fields. Just too verbose.
       //对于域什么也不做。太繁琐。
       return invocation.invokeNext();
     }
  
     System.out.println(Entering + message);
  
     // Continue on. Invoke the real method or constructor.
     // 继续。调用真正的方法或者构造器
     InvocationResponse rsp = invocation.invokeNext();
     System.out.println(Leaving + message);
     return rsp;
    }
  }
  
  上面的拦截器将拦截所有的对一个域,构造器或方法的调用。假如调用的类型是一个方法或者构造器,一个带有方法或构造器签名的消息将输出到控制平台。
  
  绑定拦截器
  好了,这样我们就定义了拦截器。但是怎么绑定这个拦截器到实际的类?为了做这个,我们需要定义一个pointcut。对于JBoss AOP, pointcuts 是在一个XML文件中定义的。让我们看一下这看起来象什么。
  
  
  
   
     
      
     

   

  
  
  上面的pointcut绑定TracingInterceptor到一个叫做POJO的类。这看起来有一点麻烦;我们不得不为每一个想跟踪的类创建一个pointcut吗?幸运的是,interceptor-pointcut的类属性可以用任何的正规表达式。所以假如你想跟踪由JVM载入的类,类表达式将变为 .*。假如你仅仅想跟踪一个特定的包,那么表达式将是com.acme.mypackge.*。
  当单独运行JBoss AOP时,任何符合 META-INF/jboss-aop.xml模式的XML文件将被JBoss AOP 运行时间所载入。假如相关的路径被包含在任何JAR或你的CLASSPATH的目录中,那个特定的XML文件将在启动时,由JBoss AOP 运行时间所载入。
  
  运行这个例子
  我们将用上面定义的pointcut去运行例子。POJO类看起来如下:
  
  [code]public class POJO
  {
    public POJO() {}
    public void helloWorld() { System.out.println(Hello World!); }
    public static void main(String[] args)
    {
     POJO pojo = new POJO();
     pojo.helloWorld();
    }
  }
  [/code]
  TracingInterceptor将拦截对main(),POJO()和helloWorld()的调用。输出看起来如下:
  Entering method: main
  Entering constructor: public POJO()
  Leaving constructor: public POJO()
  Entering method: helloWorld
  Hello World!
  Leaving method: helloWorld
  Leaving method: main
  
  你能够在这里下载JBoss AOP和离子代码。编译和执行:
  
  $ cd oreilly-aop/example1
  $ eXPort CLASSPATH=.;jboss-common.jar;jboss-aop.jar;javassist.jar
  $ javac *.java
  $ java -Djava.system.class.loader=org.jboss.aop.standalone.SystemClassLoader POJO
  
  JBoss AOP 对绑定的拦截器做字节码操作。因为没有编译步骤,AOP运行时间必须有ClassLoader的总控。假如你正运行在非JBoss应用服务器,你必须用JBoss制定的一个类载入器覆盖系统的类载入器。
  TraceingInterceptor不跟踪域访问,因为它有一点繁琐。对于开发者,实现get()和set()方法去封装域访问是一个一般的实践。假如TracingInterceptor能够过滤出,并且不跟踪这些方法,那是非常好的。这个例子显示你能够用JBoss AOP 元数据去实现基于任一方法的过滤。一般,元数据用于更复杂的事情,如定义事务属性,每个方法的安全角色或者持久性映射,但是这个例子应该足够说明元数据能够怎样用在 AOP使能的应用中。
上一篇:JBOSS-QL中的like、order by的实现 人气:456
下一篇:面向方面编程AOP和JBoss(二) 人气:484
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-12 team论坛 v2.0.4 bulid 080916 A
2008-10-12 Roclog v3.1.6
2008-10-12 SupeV v1.0.1 简体中文 GBK
2008-10-12 NetCMS v1.6.0.1010 正式版
2008-10-12 PHP考试系统PPFrame v1.2.7
2008-10-12 LPAS个人相册 v1.6.3
2008-10-12 快问仿百度知道系统 动态-静态-互
2008-10-12 方卡广告防点击系统 V1.0 GB2312
2008-10-12 泡菜内容管理系统[PCMS] v1.0 Bu
2008-10-11 联系人分组工具 v1.1 中文破解版
2008-10-11 FaceMelter变脸 v2.0 汉化破解版
2008-10-11 PathTracker道路跟踪仪 v1.2 破解
2008-10-11 Rooms手机聊天室 v0.6.7 破解版
2008-10-11 RemoteDesktop远程桌面 v1.0 破解
2008-10-11 ProRemote远程调音台 v1.0.1 破解
2008-10-11 PicShare照片共享 v1.0.0 破解版
2008-10-11 Photogene照片编辑器 v1.5 汉化破
2008-10-11 WriteRoom共享文档 v1.0 破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成