SPRING AOP LÀ GÌ

     

AOP là gì?

Trong lúc xây dựng các chương trình ứng dụng, có không ít những vụ việc liên quan liêu đến ứng dụng mà họ cần quan tiền tâm. Chẳng hạn, họ xây dựng một hệ thống đăng cam kết tạo tài khoản cho một ngân hàng. Ngoài các bước chínhcho phép tín đồ dùng hoàn toàn có thể tạo tài khoản (core concern), khối hệ thống còn phải đảm bảo các vấn đề khác (cross-cutting concern) như chứng thực người dùng, bình chọn ràng buộc, quản lý transaction, xử lý ngoại lệ, ghi log, debug, đo hiệu năng của ứng dụng, …

Logger logger = Logger.getLogger(...);TransactionManager tm = getTransactionManager();public void addAccount(Account account) logger.info("Creating (" + account + ") Account");try tm.beginTransaction();db.add(account);tm.commit(); catch (Exception) tm.rollback();logger.error("Account creation failed");Như bạn thấy, xúc tích và ngắn gọn của lịch trình của chúng ta phải làm không ít việc như ghi log, mở/ đóng góp transaction, xử trí ngoại lệ, … Khi có không ít phương thức tương tự như vậy trong ứng dụng, code bọn họ bị links chặt vào nhau, duplicate code, phân mảnh những nơi, trở ngại khi sửa đổi thay thêm logic mới, … Để giải quyết và xử lý vấn đề này, bạn có thể sử dụng kỹ thuật AOP.




Bạn đang xem: Spring aop là gì

*
*
*
*

Account.java


AllArgsConstructorpublic class tài khoản private String owner;private String currency;private int balance;
AccountService.java

package com.vincitysdaimo.com.aop.account;public interface AccountService void addAccount(Account account);void removeAccount(Account account);int getSize();AccountServiceImpl.java


package com.vincitysdaimo.com.aop.account;import java.util.ArrayList;import java.util.List;public class AccountServiceImpl implements AccountService private các mục accounts = new ArrayList();
Overridepublic void addAccount(Account account) System.out.println("addAccount: " + account);accounts.add(account);
Overridepublic void removeAccount(Account account) System.out.println("removeAccount: " + account);accounts.remove(account);
Overridepublic int getSize() System.out.println("getSize: " + accounts.size());return accounts.size();


Xem thêm: Nét Cỏ Khác Cyber Game Là Gì ? Những Tiêu Chí Đánh Giá 1 Cyber Game?

AbstractHandler.java

package com.vincitysdaimo.com.aop.handler;import java.lang.reflect.InvocationHandler;public abstract class AbstractHandler implements InvocationHandler private Object targetObject;public void setTargetObject(Object targetObject) this.targetObject = targetObject;public Object getTargetObject() return targetObject;BeforeHandler.java

package com.vincitysdaimo.com.aop.handler;import java.lang.reflect.Method;/** * The class BeforeHandler provides a template for the before execution */public abstract class BeforeHandler extends AbstractHandler /** * Handles before execution of actual method. */public abstract void handleBefore(Object proxy, Method method, Object<> args);/* * (non-Javadoc) * *
see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, * java.lang.reflect.Method, java.lang.Object<>) */
Overridepublic Object invoke(Object proxy, Method method, Object<> args) throws Throwable handleBefore(proxy, method, args);return method.invoke(getTargetObject(), args);BeforeHandlerImpl.java

package com.vincitysdaimo.com.aop.handler.impl;import java.lang.reflect.Method;import com.vincitysdaimo.com.aop.handler.BeforeHandler;/** * This class provides implementation before actual execution of method. */public class BeforeHandlerImpl extends BeforeHandler
Overridepublic void handleBefore(Object proxy, Method method, Object<> args) // Provide your own cross cutting concernSystem.out.println("Handling before actual method execution");AfterHandler.java

package com.vincitysdaimo.com.aop.handler;import java.lang.reflect.Method;public abstract class AfterHandler extends AbstractHandler /** * Handles after the execution of method. */public abstract void handleAfter(Object proxy, Method method, Object<> args);
Overridepublic Object invoke(Object proxy, Method method, Object<> args) throws Throwable Object result = method.invoke(getTargetObject(), args);handleAfter(proxy, method, args);return result;AfterHandlerImpl.java

package com.vincitysdaimo.com.aop.handler.impl;import java.lang.reflect.Method;import com.vincitysdaimo.com.aop.handler.AfterHandler;/** * This class provides an implementation of business xúc tích which will be * executed after the actual method execution. */public class AfterHandlerImpl extends AfterHandler
Overridepublic void handleAfter(Object proxy, Method method, Object<> args) // Provide your own cross cutting concernSystem.out.println("Handling after actual method execution");System.out.println("---");ProxyFactory.java


package com.vincitysdaimo.com.aop.handler;import java.lang.reflect.Proxy;import java.util.List;/** * A factory for creating Proxy objects. */public class ProxyFactory private ProxyFactory() throw new UnsupportedOperationException();public static Object getProxy(Object targetObject, list handlers) if (handlers != null && !handlers.isEmpty()) Object proxyObject = targetObject;for (AbstractHandler handler : handlers) handler.setTargetObject(proxyObject);proxyObject = Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),targetObject.getClass().getInterfaces(), handler);return proxyObject;return targetObject;


Xem thêm: Những Lời Chúc Mừng Sinh Nhật Con Gái 18 Tuổi Hay ❤️️, Những Lời Chúc Sinh Nhật Dành Cho Cô Gái 18 Tuổi

package com.vincitysdaimo.com.aop;import java.util.ArrayList;import java.util.List;import com.vincitysdaimo.com.aop.account.Account;import com.vincitysdaimo.com.aop.account.AccountService;import com.vincitysdaimo.com.aop.account.AccountServiceImpl;import com.vincitysdaimo.com.aop.handler.AbstractHandler;import com.vincitysdaimo.com.aop.handler.ProxyFactory;import com.vincitysdaimo.com.aop.handler.impl.AfterHandlerImpl;import com.vincitysdaimo.com.aop.handler.impl.BeforeHandlerImpl;/** * This class khổng lồ verify an AOP example using JDK proxy. */public class AspectOrientedProgrammingInJdkExample public static void main(String<> args) List handlers = new ArrayList();handlers.add(new BeforeHandlerImpl());handlers.add(new AfterHandlerImpl());AccountService proxy = (AccountService) ProxyFactory.getProxy(new AccountServiceImpl(), handlers);Account tài khoản = new Account("vincitysdaimo.com", "USD", 100);proxy.addAccount(account);proxy.getSize();proxy.removeAccount(account);proxy.getSize();
Output của chương trình:

Handling before actual method executionaddAccount: Account(owner=vincitysdaimo.com, currency=USD, balance=100)Handling after actual method execution---Handling before actual method executiongetSize: 1Handling after actual method execution---Handling before actual method executionremoveAccount: Account(owner=vincitysdaimo.com, currency=USD, balance=100)Handling after actual method execution---Handling before actual method executiongetSize: 0Handling after actual method execution---

Lợi ích của AOP là gì?

Tăng công dụng của Object-orented programming (OOP).AOP không phải dùng làm thay chũm OOP nhưng mà để bổ sung cho OOP,nơi mà lại OOP còn thiếu sót trong việc tạo những ứng dụng thuộc các loại phức tạp.Tăng cường tối đa năng lực tái thực hiện của mã nguồn.Module hóa ở tầm mức tiến trình/ chức năng.Code nhỏ gọn hơn do bóc tách biệt phần xử lý bao gồm và phần giải pháp xử lý liên quan.Chức năng bao gồm của chương trình không nên biết đến các công dụng phụ khác.Các công dụng phụ hoàn toàn có thể được thêm thắt, bật tắt tại thời khắc run-time phụ thuộc vào yêu cầu.Các biến đổi nếu có đối với các tính năng phụ vẫn không ảnh hưởng đến lịch trình chính.Hệ thống vẫn uyển gửi và giảm thiểu tính phụ thuộc lẫn nhau của những module. Tài liệu tham khảo: