2012-06-10 29 views
6

Tôi muốn làm rõ điều đó cho tôi.Ý tưởng lớn đằng sau việc thực hiện AOP là gì

Tôi đã đọc về khái niệm AOP và tôi hiểu rằng đó là cách tuyệt vời để chia sẻ các dịch vụ cắt chéo. (đăng nhập, bảo mật, giao dịch ...)

Nhưng tôi muốn nói/hỏi điều gì đó về ý tưởng này và nó đang thực hiện.

Tôi đọc có một số cách như AspectJ, JBOSS AOP để đồng hóa AOP với logic nghiệp vụ của tôi.

nhưng không phải ở đây đã lâu rồi?

giả ví dụ tôi muốn chia sẻ một ghi chép, an ninh thực hiện amongs thành phần của tôi (đậu Java, EJB'S, nào ..)

Tại sao tôi không thể làm cho một bean Singleton đảm bảo nó sẽ chỉ có một Ví dụ và ngay sau khi bất kỳ thành phần nào sẽ cần dịch vụ đăng nhập/bảo mật của nó, nó sẽ tra cứu và sử dụng dịch vụ của nó.

Tại sao tôi cần phải hiểu và có tất cả những triển khai "Lớn" đó như aspectj hoặc jboss AOP? Tôi nhớ gì ở đây?

Trả lời

9

Ý tưởng của AOP là duy trì logic chung ở một nơi (giải pháp singleton của bạn cũng được giải quyết) là "ẩn" (trong suốt). Với AOP, mã đăng nhập của bạn thậm chí không phải là một phần của logic nghiệp vụ, nó được "tiêm" đằng sau hậu trường.

Ngoài ra, nó còn năng động hơn - bạn không cần phải gọi dịch vụ singleton của mình mỗi lần bạn cần đăng nhập. Chỉ cần định cấu hình một phím tắt một lần (như: "tất cả các trình cài đặt trong gói này") và ghi nhật ký sẽ được áp dụng cho tất cả các mã hiện có và mã mới.

Hơn nữa, AOP linh hoạt và mạnh mẽ hơn nhiều. Bạn có thể yêu cầu triển khai AOP: "vui lòng bắt đầu giao dịch mỗi khi tôi gọi phương thức bắt đầu bằng" save* "và lấy một đối số" hoặc "nếu phương thức trả lại Customer ném ngoại lệ phân lớp từ IllegalAgumentException, hãy gọi lại phương thức đó".

AOP là nhiều hơn là chỉ nhóm logic chung.

+0

Điều gì sẽ xảy ra nếu tôi tạo lớp cha và mở rộng các lớp học của tôi mở rộng từ nó. Tôi có thể đặt tất cả logic "perment" của tôi trong lớp cha mẹ đó. khi một lớp sẽ mở rộng nó, nó sẽ có thể tận hưởng tất cả các phương thức loggig/secutiry ... mà tôi đã khai báo trước đó. Tôi cũng có thể tạo thêm các phương thức "tạo"/"hủy" cho loggig perment và như vậy .. – rayman

+0

@rayman: nhưng bạn vẫn cần ** gọi ** các phương thức này một cách rõ ràng (xem mẫu mã tuyệt vời * JB Nizet *). AOP sẽ làm điều đó cho bạn một lần được hướng dẫn, cũng cho mã bạn chưa viết! Điều này cũng có nghĩa là các lập trình viên mới sẽ tận hưởng các tính năng ghi/bảo mật mà không hề biết đến chúng.Chưa kể bạn không làm lộn xộn mã của bạn với các lớp cơ sở/phương thức trợ giúp –

+0

Mybe bạn có thể kiểm tra nhận xét cuối cùng của tôi về JB. – rayman

6

Bạn chưa hiểu AOP là gì. Ý tưởng về AOP là để có thể viết

public void foo() { 
    // some business code 
} 

thay vì viết

public void foo() { 
    LogManager.getInstance().log("entering foo..."); 
    SecurityManager.getInstance().checkUserInRole("fooer"); 
    TransactionManager.getInstance().startTransaction(); 
    try { 
     // some business code 
     TransactionManager.getInstance().commit(); 
    } 
    catch(RuntimeException e) { 
     TransactionManager.getInstance().rollback(); 
     throw e; 
    } 
    LogManager.getInstance().log("leaving foo..."); 
} 

Tất cả những mối quan tâm xuyên suốt (khai thác gỗ, an ninh, quản lý giao dịch) nằm ngoài của mã số kinh doanh, thay vì được trộn lẫn với mã doanh nghiệp và lặp lại quảng cáo nauseam.

+0

Nhưng bạn vẫn cần phải nói với logic AOP khi/nơi bạn muốn sử dụng các dịch vụ đó .. làm thế nào nó sẽ biết rằng tôi muốn đăng nhập vào/thoát của một phương pháp? hoặc nếu tôi chỉ muốn đăng nhập. hãy ghim thứ gì đó vào giữa phương thức của tôi .. some1 cần phải nói với nó để làm điều đó. nó không thể đọc được suy nghĩ của tôi .. – rayman

+0

Điều này thường được thực hiện theo cách khai báo, trong tệp cấu hình hoặc sử dụng chú thích Java. Ví dụ, Spring cho phép đánh dấu một phương thức với '@ Transactional'. Nó cũng cho phép cấu hình một interceptor AOP để làm cho tất cả các phương thức của tất cả các bean có tên lớp kết thúc bằng 'ServiceImpl' transactional (đây chỉ là một ví dụ). Nếu bạn cần phải đăng nhập một cái gì đó ở giữa phương pháp của bạn, sau đó AOP sẽ không giúp bạn. –

+0

Vì vậy, hãy để tôi sẽ sử dụng nó để đăng nhập/bảo mật chỉ .. không phải là nó một chút overkill chỉ cho điều đó? có nhiều giải pháp tôi có thể sử dụng AOP cho bên cạnh 3 bạn đề cập trước đây? – rayman

Các vấn đề liên quan