From Spring documentation:
Spring AOP sử dụng hoặc JDK proxy động hoặc cglib để tạo ra các proxy cho một đối tượng mục tiêu nhất định. (JDK proxy động được ưa thích bất cứ khi nào bạn có một sự lựa chọn).
Nếu đối tượng đích được triển khai thực hiện ít nhất một giao diện thì proxy động JDK sẽ được sử dụng. Tất cả các giao diện được thực hiện bởi loại mục tiêu sẽ được ủy nhiệm. Nếu đối tượng đích không thực hiện bất kỳ giao diện nào thì proxy CGLIB sẽ được tạo.
Nếu bạn muốn buộc sử dụng proxy CGLIB (ví dụ, để proxy mọi phương thức được xác định cho đối tượng đích, không chỉ các phương thức được thực hiện bởi giao diện của nó), bạn có thể làm như vậy. Tuy nhiên, có một số vấn đề cần xem xét:
phương pháp cuối cùng không thể được thông báo, vì chúng không thể bị quá tải.
Bạn sẽ cần các tệp nhị phân CGLIB 2 trên đường dẫn lớp của mình, trong khi proxy động có sẵn với JDK. Spring sẽ tự động cảnh báo bạn khi cần CGLIB và các lớp thư viện CGLIB không được tìm thấy trên classpath.
Hàm tạo của đối tượng proxy của bạn sẽ được gọi hai lần. Đây là một hệ quả tự nhiên của mô hình proxy CGLIB, theo đó một lớp con được tạo ra cho mỗi đối tượng được ủy quyền. Đối với mỗi cá thể được ủy quyền, hai đối tượng được tạo: đối tượng được ủy quyền thực tế và một cá thể của lớp con thực hiện lời khuyên. Hành vi này không được trưng bày khi sử dụng các proxy JDK. Thông thường, gọi hàm khởi tạo của kiểu proxy hai lần, không phải là một vấn đề, vì thường chỉ có các phép gán diễn ra và không có logic thực được thực hiện trong hàm tạo.
Nguồn
2018-01-30 08:33:18
Lấy mã tại đây:. Trong cglib bạn có thể tạo cả proxy lớp và proxy giao diện. Spring sử dụng CGlib theo mặc định trong khi AspectJ sử dụng Java proxy. Đọc phần này: http://jnb.ociweb.com/jnb/jnbNov2005.html;) –