Spring AOP là một trong những phần thiết yếu của khung mùa xuân. Ở giai đoạn rất cơ bản, khung mùa xuân dựa trên IoC và AOP. Trong khóa học chính thức của Spring có một slide trong đó ghi:
AOP là một trong những phần quan trọng nhất của khung.
Điểm mấu chốt để hiểu cách AOP in Spring hoạt động là khi bạn viết Aspect with Spring, chúng tôi sẽ tạo khung cho việc xây dựng proxy cho các đối tượng của bạn, với JDKDynamicProxy
việc bean của bạn thực hiện giao diện hoặc thông qua CGLIB nếu bean của bạn không thực hiện bất kỳ giao diện. Hãy nhớ rằng bạn phải có cglib 2.2 trong đường dẫn lớp nếu bạn đang sử dụng Spring trước phiên bản 3.2. Bắt đầu từ Spring 3.2, nó vô dụng vì cglib 2.2 đã được đưa vào lõi.
Khung công tác tạo bean sẽ tạo ra một proxy bao bọc các đối tượng của bạn và thêm các trách nhiệm liên quan đến chéo như bảo mật, quản lý giao dịch, ghi nhật ký, v.v.
Việc tạo proxy theo cách này sẽ được áp dụng bắt đầu cho một biểu thức cắt điểm giúp công cụ khung quyết định loại đậu và phương thức nào sẽ được tạo dưới dạng proxy. Lời khuyên sẽ có trách nhiệm hơn so với mã của bạn. Hãy nhớ rằng trong quy trình này, điểm cắt chỉ ghi lại các phương thức công khai không được khai báo là cuối cùng.
Bây giờ, trong khi ở Spring AOP, việc dệt các khía cạnh sẽ được thực hiện bởi container khi khởi động container, trong AspectJ bạn phải thực hiện điều này với một bài tổng hợp mã của bạn thông qua sửa đổi mã byte. Vì lý do này theo tôi, cách tiếp cận Spring đơn giản và dễ quản lý hơn AspectJ.
Mặt khác, với Spring AOP, bạn không thể sử dụng toàn bộ sức mạnh của AOP vì việc triển khai được thực hiện thông qua proxy và không phải thông qua sửa đổi mã của bạn.
Như trong AspectJ, bạn có thể sử dụng dệt thời gian tải trong SpringAOP. Bạn có thể hưởng lợi từ tính năng này vào mùa xuân được triển khai với một tác nhân và các cấu hình đặc biệt @EnabledLoadWeaving
hoặc bằng XML. Bạn có thể sử dụng không gian tên làm ví dụ. Tuy nhiên, trong Spring AOP, bạn không thể chặn tất cả các trường hợp. Ví dụ: new
lệnh không được hỗ trợ trong Spring AOP.
Tuy nhiên, trong Spring AOP, bạn có thể hưởng lợi từ việc sử dụng AspectJ thông qua việc sử dụng aspectof
phương thức nhà máy trong bean cấu hình mùa xuân.
Vì lý do Spring AOP về cơ bản là một proxy được tạo từ container, vì vậy bạn chỉ có thể sử dụng AOP cho đậu mùa xuân. Trong khi với AspectJ, bạn có thể sử dụng khía cạnh trong tất cả các loại đậu của mình. Một điểm so sánh khác là gỡ lỗi và dự đoán hành vi mã. Với spring AOP, công việc được tạo trước tất cả từ trình biên dịch Java và các khía cạnh là một cách rất hay để tạo proxy cho bean Spring của bạn. Trong AspectJ nếu bạn sửa đổi mã, bạn cần biên dịch nhiều hơn và để hiểu các khía cạnh của bạn được dệt ở đâu có thể khó khăn. Ngay cả việc tắt chế độ dệt vào mùa xuân cũng đơn giản hơn: với mùa xuân, bạn loại bỏ khía cạnh khỏi cấu hình của mình, khởi động lại và nó hoạt động. Trong AspectJ, bạn phải biên dịch lại mã!
Trong dệt thời gian tải, AspectJ linh hoạt hơn Spring vì Spring không hỗ trợ tất cả các tùy chọn của AspectJ. Nhưng theo ý kiến của tôi Nếu bạn muốn thay đổi quy trình tạo hạt, cách tốt hơn là quản lý thông tin đăng nhập tùy chỉnh trong nhà máy và không phải dệt theo thời gian tải một khía cạnh thay đổi hành vi của nhà điều hành mới của bạn.
Tôi hy vọng rằng toàn cảnh này của AspectJ và Spring AOP sẽ giúp bạn hiểu được sự khác biệt của hai loại thuốc