Sự khác biệt giữa Static AOP và Dynamic AOP

 

Nếu bạn chưa có kiến thức về Aspect oriented programming hãy tham khảo những kiến thức cơ bản về AOP trong bài viết dưới đây:

AOP là một cài đặt bổ sung cho Object oriented programming,(nó chưa thật hoàn chỉnh). Nói một cách khác, với AOP bạn có thể thực thi một đoạn mã (được gọi là advice trong thuật ngữ của AOP) ở một điểm được định nghĩa trước (được gọi là joinpont) trong quá trinh thực thi ứng dụng của bạn.

Một ví dụ với joinpont có thể được thực thi một phương thức. Bạn có thể gom nhóm một tập hợp các lời gọi phương thức trong một gói riêng biệt (vì thế đây là một ví dụ về pontcut, nhón các joinponts được gọi là pointcut).

Sự kết hợp các advice (các đoạn mã mà sẽ chạy trên một joinponts) và pointcuts được gọi là aspect. (aspect =advice +pointcuts)

Để giúp bạn hiểu rõ hơn. Bây giờ, bạn biết rằng với aop bạn có thể lựa chọn những phương thức (pointcuts) và sau đó cấu hình một lớp Logging để gọi (advice) trước và sau mỗi phương thức trong ứng dụng. Vì thế bạn không cần gọi những phương thức này và thay đổi chúng theo thời gian, hãy làm điều này với AOP. Điều thú vị ở đây là những đoạn mã này không nằm trong code mà liên quan tới business của ứng dụng.

Thuật ngữ weaving tham khảo tới tiến trình chèn các aspects vào trong đoạn mã của ứng dụng tại những điểm phù hợp. sự khác biệt giữa Static hay Dynamic AOP xảy ra ở đây.

Với Static aop, tiến trình weaving xảy ra trong thời gian biên dịch, có nghĩa advices được chèn trực tiếp và bytecode của class được biên dịch.

Với Dynamic aop, tiến trình weaving xảy ra khá linh động, nó thi hành việc chèn các mã bytecode lúc runtime. Vì thế không có bất kỳ mã bytecodes liên quan đến aop trong mã nguồn được biên dịch. Tôi nhắc lại là chúng được chèn vào trong thời gian chạy.

clip_image002

Static aop cho tốc độ tốc hơn, đơn giản vì nó không phải tốn công cho việc xử lý lúc runtime. Ở bên kia, dynamic aop thì linh động bởi vì bạn không cần biên dịch lại mã của bạn khi aspects thay đổi.

Hãy tưởng tượng, một thư viện đã có sẵn, được cung cấp bởi bên thứ 3 chẳng hạn, static aop là điều không thể (trừ khi dowload source và...build lại -hay đơn giản hơn làm một class wrapper)

Thực tế, static aop không phải sẽ đem đến một hiệu quả vượt trội, trong khi đó nó trở nên trơ cứng khi phát triển ứng dụng, đôi khi aop bị ràng buộc chặt vào ứng dụng và tính sử dụng lại bị mất đi đáng kể, mặt khác chúng ta sẽ bị trở ngại về vấn đề biên dịch.

examples:

clip_image004clip_image004[1]

public class Car {

private String color;

public String getColor() {

return color;

}

public void setColor(String color) {

this.color = color;

}

}

clip_image004[2]clip_image004[3]

public class CarDriver {

public static void main(String args[]) {

Car mycar = new Car();

mycar.setColor(”blue”);

}

}

clip_image006clip_image004[4]

public aspect CarAspect {

pointcut setColorCall(): call(public void Car.setColor(String));

before(): setColorCall() {

System.out.println(”The car color has changed!”);

}

}

clip_image008clip_image010

ajc CarAspect.aj CarDriver.java Car.java

Theo ý kiến cá nhân của tôi, trừ phi một class bị đặt yêu cầu khắt khe về tốc độ, nếu không hãy chọn dynamic aop.

clip_image012

Bạn có thể tham khảo thêm những bài giới thiệu và tutorial cơ bản với 2 liên kết dưới đây :

Static aop : với AspectJ : http://javatouch.googlepages.com/aspectjtutorial

Dynamic aop: với Spring framework : http://javatouch.googlepages.com/springaop-helloworld

Dựa trên bài viết của

Kaan Yamanyar

About Langthang

This is a short description in the author block about the author. You edit it by entering text in the "Biographical Info" field in the user admin panel.
    Blogger Comment
    Facebook Comment

0 comments :

Post a Comment