偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

面向切面編程(AOP)初探

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

面向?qū)ο缶幊掏ㄟ^設(shè)計和語言本身提供的模塊化、封裝、繼承、多態(tài)來實現(xiàn)軟件復(fù)用。盡管OOP在建模以及實現(xiàn)復(fù)雜軟件方面非常成功,它仍然有一些問題。面向切面編程(AOP)被認(rèn)為是一項有前途的新技術(shù),它通過對交叉業(yè)務(wù)的分隔來實現(xiàn),而這在面向?qū)ο缶幊汤锖茈y做到。本文通過一個新的范例介紹AOP的基本概念。

面向?qū)ο缶幊?Object Oriented Programming

今天,面向?qū)ο缶幊桃呀?jīng)成為主流的編程模式,在這里,現(xiàn)實問題被分解為一個個的包含數(shù)據(jù)和行為的對象。

在大型工程實踐中,程序員發(fā)現(xiàn)在模塊中越來越難以分離交叉業(yè)務(wù),他們的代碼也變得更加難維護(hù)。對程序設(shè)計的一絲改動都會引發(fā)大量不相關(guān)模塊的改動。

交叉業(yè)務(wù) Crosscutting Concerns

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

交叉業(yè)務(wù)可能出現(xiàn)在某些程序中,尤其是那些大型程序中。然而另一方面,對系統(tǒng)的重新設(shè)計可以將交叉業(yè)務(wù)轉(zhuǎn)換成對象。AOP假定交叉業(yè)務(wù)會出現(xiàn)在程序中,并無法從重構(gòu)中被剔除出去。

面向切面編程 Aspect Oriented Programming

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

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

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

◆AspectJ

◆AspectWerkz

◆Hyper/J

◆JAC

◆JMangler

◆MixJuice

◆PROSE

◆ArchJava

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

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

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

  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,假設(shè)我們想用切面做如下修改:

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

下面就是AspectJ 的實現(xiàn)。

  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術(shù)語,我們定義了2個切入點(pointcuts)。為了弄清楚切入點(pointcut)是什么意思,我們需要先定義連接點(join points).

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

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

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

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

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

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

AspectJ 編譯器

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

ajc MyAspect.aj TestClass.java
java TestClass

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

 

【編輯推薦】

  1. 主流編程語言的選擇和學(xué)習(xí)雜談
  2. 新型動態(tài)編程語言Snow簡介
  3. 程序員如何選擇入門編程語言?
  4. Scala簡介:面向?qū)ο蠛秃瘮?shù)式編程的組合
  5. 全面介紹C#面向?qū)ο缶幊?
責(zé)任編輯:佚名 來源: 譯言
相關(guān)推薦

2012-02-10 10:32:33

JavaSpring

2013-09-17 10:37:03

AOPAOP教程理解AOP

2023-11-07 16:00:25

面向切面編程開發(fā)

2023-10-20 09:32:25

Java技術(shù)

2011-04-26 09:33:04

SpringAOP

2024-05-21 09:55:43

AspectOrientedAOP

2023-11-30 08:00:54

面向?qū)ο?/a>面向切面

2024-04-10 08:59:39

SpringAOP業(yè)務(wù)

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

實現(xiàn)編程接口編程對象編程

2015-09-07 09:13:31

ios教學(xué)

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技術(shù)棧公眾號