成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面向切面編程(AOP)初探

開發 開發工具
面向切面編程(AOP)是一項新的技術,它將交叉業務分離出來,作為獨立單元——切面——處理。切面即是交叉業務的模塊化實現,它封裝了對各個類都有影響的行為,作為新的可重用的模塊。

面向對象編程通過設計和語言本身提供的模塊化、封裝、繼承、多態來實現軟件復用。盡管OOP在建模以及實現復雜軟件方面非常成功,它仍然有一些問題。面向切面編程(AOP)被認為是一項有前途的新技術,它通過對交叉業務的分隔來實現,而這在面向對象編程里很難做到。本文通過一個新的范例介紹AOP的基本概念。

面向對象編程 Object Oriented Programming

今天,面向對象編程已經成為主流的編程模式,在這里,現實問題被分解為一個個的包含數據和行為的對象。

在大型工程實踐中,程序員發現在模塊中越來越難以分離交叉業務,他們的代碼也變得更加難維護。對程序設計的一絲改動都會引發大量不相關模塊的改動。

交叉業務 Crosscutting Concerns

一個交叉業務的例子是“日志”,日志在分布式系統中經常被用來記錄方法調用,以輔助調試。假設我們在每個函數開始前和結束后都寫日志,這會使我們對所有包含方法的類做“橫切”(crosscutting)。其他典型的交叉業務包括:上下文敏感的錯誤處理,性能優化,以及設計模式。

交叉業務可能出現在某些程序中,尤其是那些大型程序中。然而另一方面,對系統的重新設計可以將交叉業務轉換成對象。AOP假定交叉業務會出現在程序中,并無法從重構中被剔除出去。

面向切面編程 Aspect Oriented Programming

面向切面的編程AOP是一項新的技術,它將交叉業務分離出來,作為獨立單元——切面——處理。切面即是交叉業務的模塊化實現,它封裝了對各個類都有影響的行為,作為新的可重用的模塊。利用AOP,我們可以用OO編程語言(如Java)開始項目,然后我們單獨使用切面處理交叉業務。最后,代碼和切面一起通過編織器(aspect weaver)組織成最終可執行文件。圖1說明了"編織器"工作過程。注意,原始的代碼不需要知道切面的任何功能;只要除去切面代碼并重新編譯,就能得到初始代碼的功能。

AOP是一種編程概念,因此它并未綁定到任何特定的語言。事實上,它對所有單獨的、垂直分解式(譯注:AOP通常被認為是橫向分解)的語言(不僅是OO語言)都有幫助。AOP在不同語言都有實現(如 C++, Smalltalk, C#, C, Java).

當然,受益最大的還是Java語言。下面是一些支持Java AOP的工具:

◆AspectJ

◆AspectWerkz

◆Hyper/J

◆JAC

◆JMangler

◆MixJuice

◆PROSE

◆ArchJava

由Xerox PARC所創建的AspectJ被認為是Java語言在AOP方面的一個擴展,是專門為面向切面的編程而生的。本文下面部分主要涉及AspectJ.#p#

連接點,切入點,通知和引入 Join points, Pointcut, Advice, and Introduction

就如OOP的概念包含繼承、封裝、多態一樣,組成AOP的概念是連接點,切入點,通知和引入(Join points, Pointcut, Advice, and Introduction)。為更好的理解這些術語,我們看一下下面的例子。

  1. public class TestClass {  
  2.   public void sayHello () {  
  3.     System.out.println ("Hello, AOP");  
  4.   }  
  5.  
  6.   public void sayAnyThing (String s) {  
  7.     System.out.println (s);  
  8.   }  
  9.  
  10.   public static void main (String[] args) {    sayHello ();  
  11.     sayAnyThing ("ok");  
  12.   }  
  13. }  

我們的Java代碼保存在TestClass.java,假設我們想用切面做如下修改:

在對TestClass.sayHello()方法調用之前和之后,都打印一行信息;檢查TestClass.sayAnyThing() 方法的參數,至少3個字符才能執行

下面就是AspectJ 的實現。

  1. public aspect MyAspect {  
  2.    public pointcut sayMethodCall (): call (public void 
  3.                                              TestClass.say*() );  
  4.    public pointcut sayMethodCallArg (String str): call  
  5.                      (public void TestClass.sayAnyThing (String))  
  6.                      && args(str);  
  7.  
  8.    before(): sayMethodCall() {  
  9.    System.out.println("\n TestClass." +  
  10.        thisJoinPointStaticPart.getSignature().getName() +  
  11.        "start..." );  
  12.    }  
  13.  
  14.    after(): sayMethodCall() {  
  15.    System.out.println("\n TestClass." +  
  16.        thisJoinPointStaticPart.getSignature().getName() +  
  17.        " end...");  
  18.    }  
  19.  
  20.    before(String str): sayMethodCallArg(str) {  
  21.      if (str .length() < 3) {  
  22.      System.out.println ("Error: I can't say words less than 3 
  23.                              characters");  
  24.      return;  
  25.      }  
  26.    }  
  27.  } 

Line 1 定義了一個aspect,就像我們定義Java 類。跟任何Java類一樣,aspect也可以擁有成員變量和方法,另外它還可以包含切入點(pointcuts),通知(advices)和引入(introductions).

Lines 2和Line 3指定我們的修改在TestClass什么地方起作用。按AspectJ術語,我們定義了2個切入點(pointcuts)。為了弄清楚切入點(pointcut)是什么意思,我們需要先定義連接點(join points).

連接點(join points)表示在程序執行過程中預先定義的“點”,AspectJ 中典型的連接點包括:方法或構造器的調用,方法或構造器的執行,字段的讀取,異常處理,以及靜態或動態的初始化。本文例子中,我們定義了2處連接點:對TestClass.sayHello方法的調用及對TestClass.sayAnyThing方法的調用。

切入點(Pointcut)是符合預定義規范的連接點(a set of join points)的集合,這是一個語言上的構造概念。 規范可以是明確的的函數名,也可以是包含通配符的函數名。

public pointcut sayMethodCall (): call (public void
                                        TestClass.say*() );

上面一行,我們定義了一個切入點(pointcut),叫做 sayMethodCall,它會檢查所有對TestClass.sayHello方法的調用。另外,它同樣會檢查TestClass 類里所有以"say"開頭,參數為空的公共方法(舉個例子:TestClass.sayBye).

切入點(Pointcuts)用來定義“通知” (advice). AspectJ 的advice用來定義在連接點執行之前、之中、之后的額外代碼。在我們的例子中,line 4-6 和line7-9 分別定義了對第一個切入點執行之前和之后的通知。Lines10-15定義了對第二個切入點的通知,即設置TestClass.sayAnyThing 方法執行的一個前置條件。

切入點pointcuts和通知advice能讓你影響程序的動態執行部分,與此不同,引入(introduction)允許切面修改程序中靜態的部分。通過引入(introduction), 切面可以為類添加新的方法及變量,聲明類實現的接口,或將捕獲的異常轉為未捕獲的異常。 Introduction和一個更為實用的AOP的例子是我未來一篇文章的主題。

AspectJ 編譯器

回到開頭,你需要從AspectJ 的官方網站上下載它的最新版本并安裝它(免費的),編譯和運行我們的例子非常簡單:

ajc MyAspect.aj TestClass.java
java TestClass

值得注意的是,Java源代碼TestClass.java 沒有任何改動。你只要使用Java編譯器重新編譯它就能得到最初的原始程序功能。

 

【編輯推薦】

  1. 主流編程語言的選擇和學習雜談
  2. 新型動態編程語言Snow簡介
  3. 程序員如何選擇入門編程語言?
  4. Scala簡介:面向對象和函數式編程的組合
  5. 全面介紹C#面向對象編程
責任編輯:佚名 來源: 譯言
相關推薦

2012-02-10 10:32:33

JavaSpring

2013-09-17 10:37:03

AOPAOP教程理解AOP

2023-11-07 16:00:25

面向切面編程開發

2023-10-20 09:32:25

Java技術

2011-04-26 09:33:04

SpringAOP

2024-05-21 09:55:43

AspectOrientedAOP

2023-11-30 08:00:54

面向對象面向切面

2024-04-10 08:59:39

SpringAOP業務

2010-04-26 08:53:06

面向方面編程.NET

2009-06-22 11:27:59

反向控制原理面向切面編程Spring

2009-06-22 15:10:00

java 編程AOP

2013-09-09 09:41:34

2021-10-27 07:15:37

SpringAOP編程(

2013-07-30 09:42:41

實現編程接口編程對象編程

2015-09-07 09:13:31

ios教學

2024-06-11 00:04:00

對象AdvisorAdvice

2019-11-29 16:21:22

Spring框架集成

2021-07-14 14:27:01

AndroidAOPhugo

2015-10-09 13:54:14

切面編程錯誤處理機制

2025-02-17 09:32:18

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久伊人青青草 | 超碰97干 | 激情欧美日韩一区二区 | 午夜影晥 | 精品中文字幕一区二区三区 | 色婷婷综合久久久中字幕精品久久 | 在线一区| 日本不卡一区二区三区在线观看 | 韩国主播午夜大尺度福利 | 国产激情免费视频 | 一区二区三区电影在线观看 | 国产精品99久久久久久动医院 | 久久av一区二区三区 | 四虎最新地址 | 中文字幕高清视频 | 国产一区免费视频 | jizz在线免费观看 | 精品伊人 | 午夜激情视频 | 天天夜碰日日摸日日澡 | 精品一区二区在线观看 | 黄色网址免费在线观看 | 黄色毛片免费 | 国产精品成人一区二区三区 | 91国内精精品久久久久久婷婷 | 久久久久久国产精品三区 | 九九热在线免费视频 | 免费视频久久 | 国产精品久久久久久久久免费 | 玩丰满女领导对白露脸hd | 日本一区二区不卡 | 91影院 | 久久久久久久久久久久91 | 99精品视频在线观看免费播放 | 欧美片网站免费 | 久久国产成人午夜av影院武则天 | 欧美a区 | 国产在线观看一区二区三区 | www.色婷婷| 亚洲36d大奶网| 日韩一区二区三区av |