Tài liệu này được tổng hợp từ nhiều nguồn khác nhau (xem phần tài liệu tham khảo), bao gồm các cuốn sách, các bài báo, các luận văn về vấn đề nghiên cứu và ứng dụng AOP trong ngành công nghệ phần mềm. Tài liệu nhằm mục đích tìm hiểu mô hình AOP và đi sâu trình bày một trong những kỹ thuật quan trọng của ngành công nghệ phần mềm hiện nay là design pattern trên mô hình AOP
Trước khi đọc tài liệu này bạn cần có kiến thức cơ bản về kỹ thuật lập trình hướng đối tượng, các mẫu thiết kế, các kiến trúc của phần mềm, trong ngành công nghệ phần mềm hiện nay. Đồng thời cũng cần kinh nghiệm thực tế về những khó khăn mà các phương pháp lập trình hiện tại đang gặp.
Tài liệu được chia thành 2 phần chính sau
Phần thứ nhất, từ mục 1 đến 5: Trình bày các vấn đề cơ bản về AOP, giới thiệu một phiên bản thi công của nó là AspectJ, cú pháp và các khái niệm của AspectJ. Ngoài ra trong phần này, tài liệu cũng đề cập đến các ứng dụng thích hợp cho việc áp dụng AOP.
Phần thứ 2, từ mục 6 đến hết: Trình bày cách triển khai các mẫu thiết kế (design pattern) đã được sử dụng trong mô hình OOP sang mô hình AOP, cụ thể là triển khai trên cú pháp của AspectJ.
66 trang |
Chia sẻ: tuandn | Lượt xem: 4134 | Lượt tải: 2
Bạn đang xem trước 20 trang tài liệu AOP và AspectJ, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Mục lục hình ảnh
Hình 1: Mô hình các concern mức hệ thống 8
Hình 2: Mô hình ánh xạ yêu cầu người dùng sử dụng AOP 9
Hình 3: Mô hình đa chiều về sự phụ thuộc giữa các module với nhau 9
Hình 4: Mô hình ánh xạ từ các concern hệ thống sang các phương pháp lập trình truyền thống 10
Hình 5: Các module yêu cầu logging đều phải nhúng các đoạn mã để gọi logging API 10
Hình 6: Giải quyết các concern hệ thống bằng phương pháp AOP 11
Hình 7: Các giai đoạn phát triển sử dụng phương pháp AOP 12
Hình 8: Cấu trúc của aspect trừu tượng với interface và các hàm được định nghĩa để hỗ trợ Singleton pattern 24
Hình 9:Một ứng dụng trước và sau khi được tác động bởi Singleton pattern 24
Hình 10: Các bước thực hiện của mẫu thiết kế Singleton trong ứng dụng 25
Hình 11: Cấu trúc của PrototypePattern aspect 26
Hình 12:Một ứng dụng trước và sau khi được tác động bởi Prototype pattern 27
Hình 13: Sử dụng Prototype pattern trong ứng dụng 27
Hình 14: Lược đồ UML của AbstractFactory Pattern 28
Hình 15: Lược đồ UML của factory method pattern 29
Hình 16: Cấu trúc của CompositePattern aspect 32
Hình 17: Mô hình các đối tượng trước khi áp dụng Composite pattern 34
Hình 18: Mô hình các đối tượng sau khi áp dụng Composite pattern 34
Hình 19: Hoạt động của composite pattern trong ứng dụng 34
Hình 20: Cấu trúc của FlyweightPattern aspect 35
Hình 21:Cấu trúc của XWindowBridge aspect 37
Hình 22: Sử dụng các hành vi của lớp Window trong ứng dụng 37
Hình 23: Cấu trúc của DecoratorPattern aspect 38
Hình 24:Lớp TextDisplay trước và sau khi áp dụng DecoratorPattern 38
Hình 25: Áp dụng Adapter pattern 39
Hình 26: Cấu trúc của ProxyPattern aspect 39
Hình 27: Cấu trúc của ObserverPattern aspect 42
Hình 28: Cấu trúc lớp trước khi áp dụng ObserverPattern 44
Hình 29:Cấu trúc lớp sau khi áp dụng ObserverPattern 44
Hình 30:Sử dụng ObserverPattern trong ứng dụng 45
Hình 31: Cấu trúc của CommandPattern và các hàm hỗ trợ pattern 45
Hình 32: Trước khi áp dụng CommandPattern 47
Hình 33:Trước khi áp dụng CommandPattern 48
Hình 34: Sử dụng CommandPattern trong ứng dụng 49
Hình 35: IteratorPatternAspect và interface định nghĩa vài trò của pattern 49
Hình 36: Mô tả sự tương tác của EmployeeIteration với ứng dụng 50
Hình 37: Cấu trúc của MediatorPattern aspect 51
Hình 38: Trước và sau khi áp dụng Mediator pattern 52
Hình 39: Cấu trúc của ChainOfResponsibilityPattern aspect 52
Hình 40: Sau khi áp dụng ChainOfResponsibilityPattern 54
Hình 41:Sử dụng ChainOfResponsibilityPattern trong ứng dụng 56
Hình 42: Cấu trúc của MementoPattern aspect. 57
Hình 43: Sử dụng MementoPattern trong ứng dụng 57
Hình 44: Cấu trúc của Visitor pattern aspect 58
Hình 45: Cấu trúc của Computeur 59
Hình 46: Cấu trúc Computeur sau khi áp dụng Visitor pattern 60
Hình 47:Sử dụng VisitorPattern trong ứng dụng 60
Hình 48:Cấu trúc của StrategyPattern aspect 61
Hình 49: Cấu trúc các lớp sắp xếp khi chưa áp dụng StrategyPattern 62
Hình 50: Cấu trúc các lớp sắp xếp sau khi áp dụng StrategyPattern 62
Hình 51: Sử dụng Strategy Pattern trong ứng dụng 62
Hình 52: Sử dụng state pattern trong ứng dụng 63
Giới thiệu
Việc chuyển đổi các yêu cầu của người dùng vào trong một hệ thống phần mềm bao giờ cũng rất khó khăn, mặc dù hiện nay đã có rất nhiều phương pháp tiếp cận như lập trình hướng đối tượng, hướng thành phần, các design pattern ...Chúng cũng đã giải quyết được một số vấn đề nhưng vẫn chưa có một phương pháp nào thoả mãn việc giải quyết các yêu cầu đan xen ở mức hệ thống, các yêu cầu này được mô tả bằng khái niệm crosscutting concern. Các nhà nghiên cứu lý thuyết đã đưa ra mô hình AOP để giải quyết các vấn đề mà các mô hình lập trình hiện tại chưa đáp ứng được hoặc đáp ứng được nhưng việc thực hiện nó quá phức tạp. AOP không phát minh và điều gì mới mà chỉ giải quyết các vấn đề đã tồn tại theo cách tốt hơn. (How to do the bad things in better way)
Mục đích và cấu trúc của tài liệu
Tài liệu này được tổng hợp từ nhiều nguồn khác nhau (xem phần tài liệu tham khảo), bao gồm các cuốn sách, các bài báo, các luận văn …về vấn đề nghiên cứu và ứng dụng AOP trong ngành công nghệ phần mềm. Tài liệu nhằm mục đích tìm hiểu mô hình AOP và đi sâu trình bày một trong những kỹ thuật quan trọng của ngành công nghệ phần mềm hiện nay là design pattern trên mô hình AOP
Trước khi đọc tài liệu này bạn cần có kiến thức cơ bản về kỹ thuật lập trình hướng đối tượng, các mẫu thiết kế, các kiến trúc của phần mềm, … trong ngành công nghệ phần mềm hiện nay. Đồng thời cũng cần kinh nghiệm thực tế về những khó khăn mà các phương pháp lập trình hiện tại đang gặp.
Tài liệu được chia thành 2 phần chính sau
Phần thứ nhất, từ mục 1 đến 5: Trình bày các vấn đề cơ bản về AOP, giới thiệu một phiên bản thi công của nó là AspectJ, cú pháp và các khái niệm của AspectJ. Ngoài ra trong phần này, tài liệu cũng đề cập đến các ứng dụng thích hợp cho việc áp dụng AOP.
Phần thứ 2, từ mục 6 đến hết: Trình bày cách triển khai các mẫu thiết kế (design pattern) đã được sử dụng trong mô hình OOP sang mô hình AOP, cụ thể là triển khai trên cú pháp của AspectJ.
Các thuật ngữ
Trước khi đi vào tìm hiểu về AOP (một phương pháp lập trình mới) chúng ta cần hiểu một số thuật ngữ trong ngành công nghệ phần mềm hiện nay.
crosscutting concerns
Chỉ các quan hệ giữa các module trong một hệ thống phần mềm.
refactoring
Refactoring là một kỹ thuật trong công nghệ phần mềm mà mã nguồn chương trình được cấu trúc lại nhằm đảm bảo tính mềm dẻo, mở rộng chức năng của chương trình đồng thời mã chương trình dễ hiểu hơn cho người đọc.
middleware
Là lớp trung gian trong các hệ thống phần mềm . Một số middleware tiêu biểu như EJB của Sun, Net Framework của Microsoft
AOP
Mô hình lập trình hướng tương quan
design pattern
Là giải pháp thực hiện khi thiết kế các ứng dụng nhằm đảm bảo chất lượng, tăng tính mềm dẻo, tính trong sáng của mã chương trình. Một số pattern hay được sử dụng như IOC (Inversion of Control), Singleton, Proxy, Abstract Factory Class
Hạn chế của các phương pháp lập trình hiện tại
Có lẽ khái niệm về AOP hiện nay đã được nhiều người biết đến, vì vậy ở đây ta chỉ trình bày lại ngắn gọn các khái niệm cơ bản và các đặc điểm chính của AOP
Để trả lời được câu hỏi AOP là gì? Tại sao phải có AOP? Chúng ta cần bắt đầu tìm hiểu sự hạn chế của của các phương pháp lập trình hiện tại trong việc đáp ứng các yêu cầu ngày càng phức tạp của các hệ thống phần mềm.
Có lẽ các câu hỏi thường gặp nhất trong ngành công nghệ phần mềm hiện nay là:Thiết kế một phần mềm như thế nào được gọi là đủ? Các hệ thống tốt cần xem xét đến những yêu cầu hiện tại và cả những yêu cầu tiềm tàng trong tương lai. Sự lơ là các yêu cầu trong tương lai có thể dẫn đến thay đổi nhiều phần của hệ thống hoặc có thể phải xây dựng lại. Hay nói một cách khác, các thiết kế có khả năng đáp ứng nhu cầu cho tương lai kém có thể dẫn đến hiện tượng “tràn thiết kế”, khó hiểu, hệ thống phình ra không mong muốn. Từ đó hình thành một yêu cầu có một thiết kế có thể đáp ứng được các yêu cầu trong tương lai mà không ảnh hưởng đến chất lượng.
Phương pháp lập trình OOP hiện tại đã tạo ra một cuộc cách mạng lớn trong công nghệ phần mềm, ảnh hưởng đến tất cả các pha từ xác định yêu cầu, phân tích, thiết kế, cài đặt, kiểm thử đến các hệ quản trị cơ sở dữ liệu ... Tuy nhiên, người ta nhận thấy OOP modul hoá yêu cầu theo kiểu mô phỏng một đối tượng (object) trong thế giới thực. Nhưng sự mô phỏng này chỉ dừng ở mức tĩnh. Các đối tượng trong OOP hoạt động theo qui trình: Sinh-Hoạt động-Tử, nhưng ở thế giới thực, thường thì một object có một chu kỳ sống: Sinh-Hoạt động-Phát triển-Tử. Ở đây, 'Phát triển' là điều quan trọng, giải quyết được nó tức bạn đã giải quyết được tính tiến hoá, thay đổi yêu cầu của bài toán phần mềm. Theo OOP, bạn phải cân nhắc giữa dự đoán trước các yêu cầu phát triển à Phát triển phần mềm nặng nề, hoặc bỏ qua các yêu cầu phát triển tương lai à hệ thống thiếu tính khả mở, tiến hoá.
Nhược điểm trên của OOP là thấy rõ nhất, nhược điểm thứ hai là: Một hệ thống thực tế là sự đan xen nhau giữa các yêu cầu. Lấy ví dụ: Bạn cần xử lý nghiệp vụ truy xuất dữ liệu. Trong bản thiết kế, bạn có thể phân công trách nhiệm này cho một object cụ thể nào đó và vấn đề này rất bình thường. Nhưng cùng với yêu cầu nghiệp vụ trên, thường thì cần bổ sung vào các yêu cầu: Chứng thực, Phân quyền, Bảo mật, Lưu vết... Như vậy trong method TruyXuatDuLieu() của một đối tượng được chỉ định nào đó, bạn phải bổ sung code cho các yêu cầu nêu trên. Tình trạng này, người ta gọi là sự chồng chéo giữa các yêu cầu. Nó làm nên một hệ thống lộn xộn, khó bảo trì, phát triển, tính tiến hoá cũng bị ảnh hưởng. Vì khi cần bổ sung thêm một nghiệp vụ nào khác, bạn phải thay đổi tất cả các yêu cầu nghiệp vụ liên quan.
Các đặc điểm của AOP
AOP được xây dựng trên các phương pháp lập trình hiện tại như OOP và lập trình có cấu trúc.., bổ sung các khái niệm và cấu trúc để module hoá các quan hệ đan xen. Với AOP, các quan hệ cơ bản sử dụng các phương pháp cơ bản, nếu sử dụng OOP sẽ thực thi các quan hệ cơ bản dưới hình thức lớp. Các aspect trong hệ thống đóng gói các quan hệ đan xen lại với nhau. Chúng sẽ qui định cách các module khác nhau gắn kết với nhau để định hình lên hệ thống cuối cùng.
Nền tảng cơ bản AOP khác với OOP là cách quản lý các quan hệ đan xen.Việc thực thi của từng quan hệ của AOP bỏ qua các hành vi được tích hợp vào nó. Ví dụ, bussiness module sẽ không quan tâm nó cần được log hoặc xác thực như thế nào. Kết quả là việc thực thi của từng concern tiến triển một cách độc lập.
Quản lý các concern hệ thống
Concern là các yêu cầu cụ thể hay mối quan tâm đặc trưng được xác định để thoả mãn mục tiêu chung của hệ thống. Hệ thống phần mềm là sự gắn kết của tập các concern. Ví dụ, hệ thống ngân hàng bao gồm các concern sau đây: quản lý khách hàng và quản lý tài khoản, các giao dịch nội ngân hàng, các giao dịch ATM, chăm sóc khách hàng, lưu giữ các thực thể trong hệ thống, xác nhận truy cập các dịch vụ, …Ngoài ra một phần mềm còn phải đảm bảo khả năng dễ hiểu, dễ bảo hành và duy trì, dễ phát triển.
Concern được chia làm hai loại
Concern thành phần: Thể hiện các chức năng nội tại của một module.
Concern đan xen: Thể hiện các quan hệ ràng buộc giữa các module trong hệ thống
Một ứng dụng doanh nghiệp điển hình có thể bao gồm các concern đan xen sau: authentication, logging, resource pooling, performance, storage management, data persistence, security, multithread safety, transaction integrity, error checking…
Các concern được phục vụ cho một vài module. Ví dụ, logging tác động tới tất cả module trong hệ thống, authencication tác động tới module có yêu cầu kiểm soát truy cập
Hình 1: Mô hình các concern mức hệ thống
Việc xác định được các concern trong hệ thống, chúng ta sẽ tập trung vào các concern một cách độc lập và sẽ giảm độ phức tạp của hệ thống.
Hình 2: Mô hình ánh xạ yêu cầu người dùng sử dụng AOP
Hình 3: Mô hình đa chiều về sự phụ thuộc giữa các module với nhau
Các concern đan xen nhau giữa các module, các kỹ thuật thi công hiện tại sẽ trộn chúng vào một module. Hình sau minh hoạ sự thực hiện này: Với mô hình biểu diễn nhiều chiều của các concern được ánh xạ trên các ngôn ngữ một chiều như sau.
Hình 4: Mô hình ánh xạ từ các concern hệ thống sang các phương pháp lập trình truyền thống
Trong thiết kế phần mềm cách tốt nhất để đơn giản các hệ thống phức tạp là xác định các concern rồi module hoá chúng. OOP được thiết kế để phục vụ việc module hoá các concern cơ bản, nhưng khi gặp concern mức hệ thống thì OOP không đáp ứng được yêu cầu. Hình sau minh hoạ một ví dụ thiết kế dùng phương pháp truyền thống. Ngay cả khi bạn có một bản thiết kế tốt của logging module như: cung cấp các API trừu tượng (Abstract API), giấu cách định dạng log message…Các module còn lại vẫn cần phải nhúng các đoạn mã để gọi các logging API.
Hình 5: Các module yêu cầu logging đều phải nhúng các đoạn mã để gọi logging API
Đây chính là vấn đề sẽ được giải quyết bằng AOP, sử dụng AOP các module khác không cần chứa đoạn mã gọi logging API. Hình 7 chỉ ra cách thực hiện module logging dùng AOP có cùng chức năng với cách sử dụng OOP, như đã được chỉ ra trên hình vẽ, cách thực hiện log bây giờ chỉ tồn tại trong logging module và logging aspect. Các modulek khác không chứa bất kỳ đoạn mã nào gọi đến logging API. Như vậy các yêu cầu đan xen giữa logging module và các module khác được thực hiện duy nhất trong một module hay logging aspect. Với phương pháp module hoá này bất cứ sự thay đổi yêu cầu nào về logging chỉ ảnh hưởng duy nhất đến logging aspect.
Hình 6: Giải quyết các concern hệ thống bằng phương pháp AOP
Phương pháp luận của AOP
Việc phát triển các hệ thống sử dụng AOP tương tự như phát triển các hệ thống sử dụng các phương thức khác: xác đinh concern, thực hiện chúng, kết hợp lại để thành hệ thống cuối cùng. Tuy nhiên cộng đồng nghiên cứu AOP đề xuất ba bước thực hiện sau:
Aspectual decomposition: Trong bước này chúng ta phân tách các yêu cầu nhằm xác định các concern lõi và concern đan xen. Các concern lõi được tách ra khỏi các concern đan xen.
Concern Implementation: Thực thi các concern một cách độc lập
Aspectual Recomposotion: Trong bước này chúng ta chỉ ra các quy lật kết hợp bằng cách tạp ra các aspect. Quá trình này còn được gọi là quá trình dệt mã, sử dụng các thông tin trong aspect để cấu thành hệ thống đích
Hình 7: Các giai đoạn phát triển sử dụng phương pháp AOP
Ưu điểm của AOP
Khi sử dụng AOP để giải quyết các bài toán chúng ta cần suy nghĩ về thiết kế và thi công hệ thống theo một phương thức mới, với AOP ta sẽ có các ưu điểm sau
Tách biệt chức năng hơn của các module độc lập
Tính module hoá cao hơn
Phát triển hệ thống dễ dàng hơn
Kết nối muộn thiết kế
Tăng khả năng sử dụng lại mã
Giảm thời gian thi công hệ thống
Giảm giá thành của sản phẩm
Những nhược điểm
Mặc dù AOP có các ưu điểm trên khi thiết kế và thi công một hệ thống,nhưng trên thực tế AOP cũng có một vài đặc điểm gay trở ngại sau
AOP thực ra không giải quyết các vấn đề mới, không giải quyết được vấn đề vẫn chưa được giải quyết. AOP giải quyết các bài toán theo cách tốt hơn
AOP không là cứu cánh cho các thiết kế cẩu thả
AOP phá vỡ tính đóng gói (encapsulation)
Một số công cụ hỗ trợ làm việc với AOP
AOP hiện nay đã được nghiên cứu và áp dụng vào hầu hết các ngôn ngữ như Java, C, C#, Python, PHP ..
Tên dự án
Địa chỉ
AspectJ
Aspectj.org
AspectWerkz
Aspectwerkz.codehaus.org
Jboss AOP
Jboss.org
Sping AOP
www.spring framework.org
Aspect#
Aspectsharp.sourceforge.net
AspectC++
Aspectc.org
JAC
Jac.objectweb.org
Giới thiệu AspectJ
Giới thiệu
AspectJ là sự mở rộng theo mô hình AOP của ngôn ngữ Java, với sự mở rộng này mã chương trình viết bằng Java sẽ tương thích với chương trình viết bằng AspectJ.
AspectJ bao gồm hai phần: đặc tả ngôn ngữ và phần thực thi. Phần đặc tả ngôn ngữ sẽ chỉ ra cách viết code, với AspectJ các concern cơ bản được viết bằng Java, các concern hệ thống được thực hiện bởi AspectJ. AspectJ đã được plugin vào công cụ phát triển Eclipse (eclipse.org) và được đánh giá là sản phẩm tốt nhất hiện nay về AOP
Một số khái niệm
Như đã biết mục đích của AOP là module hoá các concern đan xen nhau. AspectJ định nghĩa 2 loại concern:
concern đan xen tĩnh (static crosscutting): Là sự gắn kết thay đổi trong một cấu trúc tĩnh (class, interface, aspect). Nghĩa là khi chúng ta thực hiện một thay đổi đến các cấu trúc dữ liệu tĩnh để đáp ứng các yêu cầu của bài toán.
concern đan xen động (dynamic crosscutting): là sự gắn kết các hành vi mới vào chương trình, hầu hết các concern đan xen trong AspectJ là concern đan xen động.
AspectJ sử dụng dự mở rộng của Java để chỉ ra các luật gắn kết cho concern tĩnh và concern động.
Join point
Join point là một khái niệm cở bản của AspectJ, Join point có thể là bất kỳ điểm nào có thể xác định được khi thực hiện chương trình. Có thể là lời gọi đến một phương thức hoặc một lệnh gán cho một biến của đối tượng. Trong AspectJ mọi thứ đều xoay quanh join point.
public class Account {
...
void credit(float amount) {
balance + = amount;
}
}
Join point được phân loại như sau
join point tại các phương thức
join point tại hàm dựng (contructor)
join point tại điểm truy cập các thuộc tính
join point tại điểm điều khiển ngoại lệ: Được biểu diễn trong khối điều khiển ngoại lệ
try {
account.debit(amount);
} catch (InsufficientBalanceException ex) {
postMessage(ex);
OverdraftManager.applyOverdraftProtection(account,
amount);
}
join point tại các advice:
public aspect MannersAspect {
before() : deliverMessage() {
System.out.print("Hello! ");
}
}
public aspect LoggingAspect {
after() : loggedOperations() {
...
_logger.log(...);
...
}
}
Pointcut
Pointcut là một cấu trúc chương trình mà nó chọn các join point và ngữ cảnh tại các joint point đó. Ví dụ một pointcut có thể chọn một join point là một lời gọi đến một phương thức và lấy thông tin ngữ cảnh của phương thức đó như đối tượng chứa phương thức, các đối số của phương thức đó.
Cú pháp của pointcut được khai báo như sau:
[access specifier] pointcut pointcut-name([args]) : pointcut-definition
Ví dụ:
execution(void Account.creadit(float))
Bảng ánh xạ giữa các join point được chọn cho các point cut
Thực hiện phương thức
execution(MethodSignature)
Gọi phương thức
call(MethodSignature)
Thực hiện hàm dựng
execution(ConstructorSignature)
Gọi hàm dựng
call(ConstructorSignature)
Khởi tạo class
staticinitialization(TypeSignature)
Đọc thuộc tính
get(FieldSignature)
Ghi thuộc tính
set(FieldSignature)
Thực hiện điều khiển ngoại lệ
execution handler(TypeSignature)
Khởi tạo đối tượng
initialization(ConstructorSignature)
Tiền khởi tạo đối tượng
preinitialization(ConstructorSignature)
Thực hiện advice
adviceexecution()
Advice
Là mã được thực hiện tại một join point mà đã được chọn bởi pointcut. Advice tương tự cấu trúc của hàm cung cấp các thức các hành động đan xen tại các join point mà nó được chọn bởi point cut. Pointcut và advice sẽ hình thành nên các luật đan kết các quan hệ đan xen.
Advice được chia thành 3 loại sau
before: Được thực hiện trước join point
after: Được thực hiện sau join point
around: Bao quanh sự thực hiện join point, advice này có thể thực hiện vòng, thực hiện tiếp của mã nguồn ban đầu hoặc thực hiện thay đổi ngữ cảnh (tham số của hàm, …)
Giả sử ta có pointcut được khai báo như sau
pointcut connectionOperation(Connection connection)
: call(* Connection.*(..) throws SQLException)&& target(connection);
Ta có thể xây dựng các advice như sau:
before(Connection connection):connectionOperation (connection) {
System.out.println("Performing operation on " + connection);
}
Object around(Connection connection) throws SQLException
: connectionOperation (connection) {
System.out.println("Operation " + thisJoinPoint
+ " on " + connection+ " started at " + System.currentTimeMillis());
proceed(connection);
System.out.println("Operation " + thisJoinPoint
+ " on " + connection
+ " completed at "
+ System.currentTimeMillis());
}
Nếu trong around advice muốn thực hiện thao tác tại join point, phải sử dụng từ khoá proceed().
Introduction
Introduction là một lệnh chỉ ra sự thay đổi đến một class, interface, aspect. Nó tạo ra sự thay đổi tĩnh đến các module mà không trực tiếp ảnh hưởng đến các hành vi của module đó. Ví dụ có thể thêm một phương thức hoặc một trường vào lớp nào đó hoặc sửa đổi cấu trúc thừa kế của một đối tượng.
Ví dụ khai báo sau sẽ sửa đổi cấu trúc thừa kế của đối tượng Account.
declare parents: Account implements BankingEntity;
Introduction là khái niệm sinh ra để can thiệp vào các cấu trúc tĩnh, trong AOP nó được dùng để xử lý các quan hệ đan xen tĩnh (static crosscutting). Chúng ta sẽ đề cập đến vấn đề này trong phần static crosscutting.
Aspect
Aspect là phần tử tập trung của AspectJ, giống như class trong Java. Aspect chứa mã thể hiện các luật đan kết cho concern. Join point, pointcut, advice, introduction được kết hợp trong aspect.
Aspect được khai báo theo mẫu sau
[access specification] aspect
[extend