AOP技术详解

作者: 夏天吃冰棍 | 来源:发表于2019-05-18 01:54 被阅读2次

AOP术语

AspectJ(切面)

切面通常指封装的用于横向插入系统功能的类


什么是切面

Joinpoint(连接点)

在程序执行过程中的某个阶段点,它实际上指是对象的一个操作,例如方法的调用或者异常的抛出。

Pointcut(切入点)

是指切面与程序流程的交叉点,即那些需要处理的连接点。在程序中,切入点通常是指类或者方法名,如某个通知要应用到所有以add开头的方法中,那么所有满足这一规则的方法都是切入点。


连接点和切入点

Advice(通知/增强处理)

AOP框架在特定的切入点执行的增强处理,即在定义好的切入点处所要执行的程序代码。可以将其理解为切面类中的方法,它是切面的具体实现

Target Object(目标对象)

是指所有被通知的对象,也称为被增强对象,如果AOP框架采用的是动态的AOP实现,那么该对象就是一个被代理对象

Proxy(代理)

将通知应用到目标对象之后,被动态创建的对象。

Weaving(织入)

将切面代码插入到目标对象上,从而生成代理对象的过程。

AOP实现一:JDK-Proxy java动态代理

Java动态代理

在java中java.lang.reflect.Proxy提供了动态代理

在java中通过

Proxy.newProxyInstance()

创建代理对象

InvocationHandler 接口是动态代理的核心
通过Proxy.newProxyInstance() 创建对象的对象在运行过程中产生的所有方法都会调用InvocationHandler的invoke方法

public class JdkProxy implements InvocationHandler {
    private UserDaoJDK userDaoJDK;
    public Object createProxy(UserDaoJDK userDaoJDK) {
        this.userDaoJDK=userDaoJDK;
        ClassLoader classLoader = JdkProxy.class.getClassLoader();
        Class<?>[] interfaces = userDaoJDK.getClass().getInterfaces();
        
        return Proxy.newProxyInstance(classLoader, interfaces, this);
        
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        MyAspect myAspect = new MyAspect();
        myAspect.check_Permissions();
        Object object = method.invoke(userDaoJDK, args);
        myAspect.log();
        return object;
    }

}
public class MyAspect {
    public void check_Permissions() {
        System.out.println("模拟检测权限");
    }
    public void log() {
        System.out.println("模拟记录日志");
    }
}

UserDaoJDKImp

public class UserDaoJDKImpl implements UserDaoJDK {

    @Override
    public void addUser() {
        System.out.println("添加用户");
    }

    @Override
    public void deleteUser() {
        System.out.println("删除用户");
    }

}

Main

public class JDKTest {
    public static void main(String[] args) {
        JdkProxy jdkProxy = new JdkProxy();
        UserDaoJDK userDaoJDK= new UserDaoJDKImpl();
        UserDaoJDK userDaoJDKProxy = (UserDaoJDK)jdkProxy.createProxy(userDaoJDK);
        userDaoJDKProxy.addUser();
        userDaoJDKProxy.deleteUser();
    }
}
输出日志

AOP实现二:CGLIB-Code Generation Library

CGLIB

通过核心类Enhancer

调用setSuperclass();

确定目标对象。

调用setCallback添加监听函数
intercept 会在程序执行目标对象方法时调用,intercept 会执行切面中的增强方法
public class CglbProxy implements MethodInterceptor{
    public Object creatProxy(Object obj) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(obj.getClass());
        enhancer.setCallback(this);
        return enhancer.create();
    }
    @Override
    public Object intercept(Object arg0, Method method, Object[] args, MethodProxy arg3) throws Throwable {
        MyAspect myAspect = new MyAspect();
        myAspect.check_Permissions();
        Object object = arg3.invokeSuper(arg0, args);
        myAspect.log();
        return object;
    }

}

相关文章

网友评论

    本文标题:AOP技术详解

    本文链接:https://www.haomeiwen.com/subject/dbczaqtx.html