深入AOP(1)

Created
Oct 30, 2021 06:28 AM
Tags
Spring

什么是AOP?

wiki百科介绍
In computingaspect-oriented programming (AOP) is a programming paradigm that aims to increase modularity by allowing the separation of cross-cutting concerns. It does so by adding additional behavior to existing code (an advicewithout modifying the code itself, instead separately specifying which code is modified via a "pointcut" specification, such as "log all function calls when the function's name begins with 'set'". This allows behaviors that are not central to the business logic (such as logging) to be added to a program without cluttering the code core to the functionality.
AOP是面向切面编程,当我们需要修改一个类的某个方法,可以直接对该类进行重新编程,但是有的时候我们不希望去修改原本的类,那么该怎么办的?AOP就是这样一个工具,可以动态的在类里面增加代码,而不需要去重新修改原本的类。

为什么要用AOP?

当我们需要动态修改一个类的某个方法,重新编程会很麻烦,例如我们需要做一个日志的监控,那么所有的方法都要加入固定的几行代码,这很麻烦,耦合度太高,有了AOP,我们只需要告诉AOP的类去代理哪几个我们需要的类,他就能自动地在这些类前后增加代码(是在JVM的字节码层面),同时又不会改变源代码,耦合度极低。

怎么用AOP?

主流的AOP有两种,JDK动态代理和CGLIB动态代理。

JDK动态代理

JDK动态代理需要一个接口,通过接口创建代理对象,对原对象增强。
先准备好我们的接口和原对象。
package demo.service;

public interface UserService {
    public void eat();
}
接口
package demo.service;

public class UserServiceImpl implements UserService{
    public void eat() {
        System.out.println("我吃饭了");
    }
}
实现类
然后编写代理类
@Test
public void test03(){
    final UserServiceImpl userServiceImpl = new UserServiceImpl();
    UserService userService = (UserService) Proxy.newProxyInstance(UserService.class.getClassLoader(),
            new Class[]{UserService.class}, new InvocationHandler() {
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("饭前洗手");
            Object invoke = method.invoke(userServiceImpl, args);
            System.out.println("饭后洗碗");
            return invoke;
        }
    });
    userService.eat();
}
代理类
调用结果
notion image
 

CGLIB动态代理