Lời giải thích của giáo dân cho một số người chưa quen với các khái niệm AOP. Điều này không phải là đầy đủ, nhưng sẽ giúp nắm bắt các khái niệm. Nếu bạn đã quen với các biệt ngữ cơ bản, bạn có thể ngừng đọc ngay bây giờ.
Giả sử bạn có một Nhân viên lớp bình thường và bạn muốn làm gì đó mỗi khi các phương thức này được gọi.
class Employee{
public String getName(int id){....}
private int getID(String name){...}
}
những phương thức này được gọi là JoinPoints . Chúng ta cần một cách để xác định các phương thức này để khung công tác có thể tìm thấy các phương thức, trong số tất cả các lớp. Phương thức mà nó đã tải. Vì vậy, chúng tôi sẽ viết một biểu thức chính quy để khớp với chữ ký của các phương thức này. Mặc dù có nhiều thứ hơn như bạn sẽ thấy bên dưới, nhưng một cách lỏng lẻo thì biểu thức chính quy này là thứ định nghĩa Pointcut . ví dụ
* * mypackage.Employee.get*(*)
Đầu tiên * dành cho bổ ngữ công khai / riêng tư / bảo vệ / mặc định. Thứ hai * dành cho kiểu trả về của phương thức.
Nhưng sau đó bạn cũng cần nói thêm hai điều:
- Khi nào nên thực hiện một hành động - ví dụ: Trước / Sau khi thực hiện phương thức HOẶC ngoại lệ
- Nó nên làm gì khi nó khớp (có thể chỉ in một tin nhắn)
Sự kết hợp của hai điều này được gọi là Lời khuyên .
Như bạn có thể tưởng tượng, bạn sẽ phải viết một hàm để có thể thực hiện # 2. Vì vậy, đây là cách nó có thể trông như thế nào đối với những điều cơ bản.
Lưu ý: Để rõ ràng, hãy sử dụng từ REGEX thay vì * * mypackage.Employee.get*(*)
. Trong thực tế, biểu thức đầy đủ đi vào định nghĩa.
@Before("execution(REGEX)")
public void doBeforeLogging() {....} <-- executed before the matching-method is called
@After("execution(REGEX)")
public void doAfterLogging() {....} <-- executed after the matching-method is called
Một khi bạn bắt đầu sử dụng chúng một chút, bạn có thể sẽ chỉ định nhiều lời khuyên @ After / @ Before / @ Around. Các biểu thức chính quy lặp đi lặp lại cuối cùng sẽ khiến mọi thứ trở nên khó hiểu và khó duy trì. Vì vậy, những gì chúng tôi làm, chúng tôi chỉ đặt tên cho biểu thức và sử dụng nó ở mọi nơi khác trong lớp Aspect.
@Pointcut("execution(REGEX)") <-- Note the introduction of Pointcut keyword
public void allGetterLogging(){} <-- This is usually empty
@Before("allGetterLogging")
public void doBeforeLogging() {....}
@After("allGetterLogging")
public void doAfterLogging() {....}
BTW, bạn cũng muốn gói toàn bộ logic này trong một lớp, được gọi là Aspect và bạn sẽ viết một lớp:
@Aspect
public class MyAwesomeAspect{....}
Để tất cả những thứ này hoạt động, bạn phải yêu cầu Spring phân tích cú pháp các lớp để đọc, hiểu và thực hiện hành động trên các từ khóa @ AOP. Một cách để làm điều đó là chỉ định những điều sau trong tệp xml cấu hình mùa xuân:
<aop:aspectj-autoproxy>