Spring--代理模式

2022-08-13  本文已影响0人  何以解君愁

代理模式:
二十三种设计模式中的一种,属于结构型模式。它的作用就是通过提供一个代理类,让我们在调用目标方法的时候,
不再是直接对目标方法进行调用,而是通过代理类间接调用。让不属于目标方法核心逻辑的代码从目标方法中剥离出来一—解耦。
调用目标方法时先调用代理对象的方法,减少对目标方法的调用和打扰,同时让附加功能能够集中在一起也有利于统一维护。
(简而言之,是为目标对象创建代理对象,访问目标对象通过代理对象访问,在代理对象控制目标对象实现的功能,我们可以在代理对象中在目标对象实现上加入一些额外功能的操作)

静态代理:大致思路,创建一个类继承目标对象的方法,重写,之后在重写之上创建private 目标对象 自己取名;创建有参构造
(一对一,代码写死,不具备灵活性,出现大量重复代码)(了解即可)

动态代理
(jdk模板)(必须有接口,最终生成代理类在com.sun.proxy包下,类名为$proxy2且其和目标类实现相同的接口):
public class ProxyFactory {
    private Object target;

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

    public Object getProxy() {
        /**
         * cLassLoader loader:指定加载动态生成的代理类的类加载器
         * cLass[] interfaces:获取目标对象实现的所有接口的cLass对象的数组
         * InvocationHandler h:设置代理类中的抽象方法如何重写
         */
        ClassLoader classLoader = this.getClass().getClassLoader();
        Class<?>[] interfaces = target.getClass().getInterfaces();
        InvocationHandler h = new InvocationHandler() {
            //proxy表示代理对象,method表示要执行的方法,args表示要执行的方法到的参数列表
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    //此处添加额外的操作
                Object result = method.invoke(target, args);
                return result;
            }
        };
        return Proxy.newProxyInstance(classLoader,interfaces,h);
    }
}

调用:假如有一个Calculator接口及其实现类
proxyFactory proxyFactory = new ProxyFactory(new calculatorImpl());
//向上转型获取类型
calculator proxy = (calculator) proxyFactory.getProxy();
proxy. add( i: 1, j: 2);
(cglib动态代理,最终生成的代理类会继承目标类并和目标类在相同包下)

上一篇 下一篇

猜你喜欢

热点阅读