Trong bài viết trước giới thiệu về lập trình hướng khía cạnh, mình đã giới thiệu với các bạn 3 cách để chèn code sử dụng AspectJ bao gồm: compile-time weaving, post-compile weaving và load-time weaving. Compile-Time Weaving là cách dễ dàng và đơn giản nhất, việc chèn sẽ xảy ra ngay lúc chúng ta compile source code ra thành những .class file. Cụ thể như thế nào? Chúng ta hãy cùng nhau tìm hiểu thêm về nó trong bài viết này các bạn nhé!
Mình sẽ tạo mới Maven project để làm ví dụ:
Java version 11:
1 2 3 4 |
<properties> <maven.compiler.target>11</maven.compiler.target> <maven.compiler.source>11</maven.compiler.source> </properties> |
AspectJ dependency:
1 2 3 4 5 |
<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.9.9.1</version> </dependency> |
Thật ra, việc chèn code, ngay từ ban đầu lúc AspectJ được phát triển, chúng ta sẽ sử dụng AspectJ Development Tool nhưng sau này chúng ta đã có plugin Mojo’s AspectJ Maven Plugin với wrapper AspectJ compiler trong nó nên giờ chúng ta chỉ cần sử dụng plugin này trong Maven project là được rồi. Các bạn khai báo plugin này như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>aspectj-maven-plugin</artifactId> <version>1.14.0</version> <configuration> <source>11</source> <target>11</target> </configuration> <executions> <execution> <goals> <goal>compile</goal> </goals> <configuration> <complianceLevel>11</complianceLevel> </configuration> </execution> </executions> </plugin> |
Bây giờ, giả sử mình có một class cần chèn code như sau:
1 2 3 4 5 6 7 8 |
package com.huongdanjava.aspectj; public class HelloWorld { public void hello() { System.out.println("Hello"); } } |
Cái mình cần chèn là sau khi ứng dụng của chúng ta gọi phương thức hello() của đối tượng HelloWorld để print dòng text “hello”, nó sẽ tiếp tục in ra dòng chữ “, Khanh”.
Để làm được điều này, trước tiên, chúng ta phải có một tập tin để cấu hình dòng chữ chúng ta cần chèn trước, nội dung của class cấu hình sẽ như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package com.huongdanjava.aspectj; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; @Aspect public class ApplicationAspect { @After("execution (* com.huongdanjava.aspectj.HelloWorld.*(..))") public void allMethods() { System.out.println(", Khanh"); } } |
Mình sẽ giải thích về annotation @After và các cấu hình của nó trong bài viết sau nhé các bạn.
Class chính để chạy ví dụ có nội dung như sau:
1 2 3 4 5 6 7 8 9 10 |
package com.huongdanjava.aspectj; public class Application { public static void main(String[] args) { HelloWorld hello = new HelloWorld(); hello.hello(); } } |
Bây giờ chúng ta sẽ compile source code của class HelloWorld và source code chúng ta cần chèn sử dụng plugin aspectj-maven-plugin.
Các bạn hãy mở Terminal hoặc Console lên rồi đi đến thư mục project, sau đó thì sử dụng câu lệnh Maven sau để compile source code:
1 |
mvn clean compile |
Kết quả:
Đến đây, các bạn có thể đi vào thư mục target của project, chạy ứng dụng của chúng ta sử dụng câu lệnh java sau để kiểm tra kết quả sau khi compile:
1 |
java -cp "classes:/Users/khanh/.m2/repository/org/aspectj/aspectjrt/1.9.9.1/aspectjrt-1.9.9.1.jar" com.huongdanjava.aspectj.Application |
Kết quả: