AOP中的代理模式

springAOP的底层是代理模式!
代理模式就是为其他对象提供一个代理以控制对某个对象的访问。代理类主要负责为委托了(真实对象)预处理消息、过滤消息、传递消息给委托类,代理类不现实具体服务,而是利用委托类来完成服务,并将执行结果封装处理。
其实就是代理类为被代理类预处理消息、过滤消息并在此之后将消息转发给被代理类,之后还能进行消息的后置处理。代理类和被代理类通常会存在关联关系(即上面提到的持有的被带离对象的引用),代理类本身不实现服务,而是通过调用被代理类中的方法来提供服务。
代理模式的分类:

  • 静态代理
  • 动态代理

静态代理

角色分析

  • 抽象角色:一般使用接口或者抽象类取解决
  • 真实角色:被代理的角色
  • 代理角色:代理真实角色,代理角色后,会使用一些附属操作
  • 客户:访问代理对象的人

优点:

  • 可以使用真实角色的操作更加纯粹,不用去关注一些公共的业务
  • 公共也就是交给了代理角色,实现了业务的分工
  • 公共业务发生扩展时,方便集中管理

缺点:

  • 一个真实角色会产生一个代理角色,开发效率会变低

为什么不能直接改变原有代码,在公司改动原有的代码是大忌,可能把别人的代码改错。

动态代理

  • 代理对象必须实现一个接口,否则会报异常,原理就是根据接口来生成代理对象的。
  • 是通过反射来实现调用的
  • 动态代理和静态代理角色是一样的
  • 动态代理是代理类是动态生成的,不是直接写好的。
  • 需要了解两个类:ProxyInvocationHandler

例子如下:

public interface UserService {
    public void add();
    public void del();
}
public class UserServiceImpl implements UserService{
    @Override
    public void add() {
        System.out.println("添加");
    }

    @Override
    public void del() {
        System.out.println("删除");

    }
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//用这个类自动生成代理类
public class ProxyInvocationHandler implements InvocationHandler {
    //被代理的接口
    private Object target;

    public void setTarget(Object target) {
        this.target = target;
    }

    //生成代理实例
    public Object getProxy(){
        return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }

    //处理代理实例,并返回结果
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //动态代理的本质,是通过反射机制实现
        Object result = method.invoke(target,args);
        return result;
    }
}
import com.chen.ProxyInvocationHandler;
import com.chen.UserService;
import com.chen.UserServiceImpl;

public class Test {
    public static void main(String[] args) {
        UserServiceImpl userService = new UserServiceImpl();
        ProxyInvocationHandler pih = new ProxyInvocationHandler();
        pih.setTarget(userService);
        UserService proxy = (UserService) pih.getProxy();
        proxy.add();
    }
}

输出:

添加

aop实现机制

AOP中的代理模式_第1张图片

你可能感兴趣的:(AOP中的代理模式)