AOP

代理模式

需求:在核心业务代码外,添加其他代码,且重复调用

使用代理函数调用核心业务代码,达到在核心代码前后添加其他代码的目的。

 

静态代理:

1对1代理,每个类和每个函数都要写对应的代理

 

动态代理:

使用反射机制

 

jdk动态代理

必须有接口,最终生成的代理类在com.sun.proxy包下,类名为$proxy1 $proxyN

package com.darkpar.spring.Proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

public class ProxyFactory {
    private Object target;

    public ProxyFactory(Object target){
        this.target=target;
    }

    public Object getProxy(){
        ClassLoader classLoader = target.getClass().getClassLoader();
        Class<?>[] interfaces = target.getClass().getInterfaces();
        InvocationHandler invocationHandler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                Object result=null;
                try {
                    System.out.println(method.getName()+"参数:"+ Arrays.toString(args));
                    result=method.invoke(target,args);
                    System.out.println(method.getName()+"结果:"+ result);
                } catch (Exception e) {
                    System.out.println(method.getName()+"异常:"+ e.getMessage());
                    throw new RuntimeException(e);
                } finally {
                    System.out.println(method.getName()+"结束");
                }

                return result;
            }
        };

        return Proxy.newProxyInstance(classLoader,interfaces,invocationHandler);
    }


}

 

其中classLoader是类加载器,interfaces是target所实现的所有接口,invocationHandler中invoke是对被代理的函数所执行的操作

proxyFactory是代理工厂,可以生成target类的代理类,生成的代理类为com.sun.proxy.$Proxy0

 

这种实现利用了reflect反射包中的Proxy类,封装了反射,比我想的简单很多,我还以为要自己操作每个函数级别的反射。

 

类加载器:

根类加载器

扩展类加载器

应用类加载器(程序员写的一般都用这个加载)

自定义类加载器

 

cglib动态代理

最终生成的代理类会集成目标类,并且和目标类在相同包下。

 

AOP概念

Aspect Oriented Programming 是一种设计思想,指面向切面编程,是面向对象编程的一种补充和完善。

它通过预编译方式和运行期动态代理方式实现 在不修改源代码的情况下给程序动态统一添加额外功能的一种技术。

 

其中,OOP指的是类与类之间的继承关系,纵向由上而下的添加,子类在继承父类已有的东西的同时添加或重写功能。

AOP是横向,为指定的核心代码的前后等周围位置,添加特定的功能。

分别表示纵向和横向的思想。

AOP术语

横切关注点

多个方法抽取不同的非核心业务,每个这种方法都是一个横切关注点。可以使用多个横切关注点对核心代码进行不同方面的增强。

通知

需要把横切关注点封装到一个类中,这个类就叫做一个切面,被封装的每一个横切关注点都叫做一个通知。

通知种类

前置通知:在被代理的目标方法前执行
返回通知:在被代理的目标方法成功结束后执行(寿终正寝)
异常通知:在被代理的目标方法异常结束后执行(死于非命)
后置通知:在被代理的目标方法最终结束后执行(盖棺定论)
环绕通知:使用try...catch...finally结构围绕整个被代理的目标方法,包括上面四种通知对应的所有位置 

切面

封装通知方法的类

目标

被代理的对象叫做目标对象

代理

为目标对象应用通知之后创建的代理对象 

连接点

逻辑概念,目标方法中对应的可以被通知的位置叫做连接点

切入点

定位连接点的方式,即应该把哪个横切关注点放到切面中的哪个时刻

 

emmm,突然想到的

感觉AOP还是有局限性,不知道后面的课有没有讲到新的方法

对于需要横向关注的方法来说,需要被包裹或代理执行,如果是多层次的,还是会有很多的代码需要同时修改。