Spring 代理

Spring 代理

对象代理,就是一个对象代表另一个对象来完成具体业务功能。

静态代理

静态代理是通过编码实现的,设计模式中有代理模式就是静态代理的一个例子。

java 复制代码
package com.hk.eshop.proxy;

public interface Subject {
    public String request();
}


package com.hk.eshop.proxy;

public class RealSubject implements Subject{
    public String request() {
        return "RealSubject";
    }
}


package com.hk.eshop.proxy;

public class ProxySubject implements Subject{
    public String request() {
        try
        {
            Subject subject = new RealSubject();
            long start = System.currentTimeMillis();
            Thread.sleep(300);
            String rtn = subject.request();
            long end = System.currentTimeMillis();
            return rtn +" kill time ("+(end-start)+")ms";
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        return null;
    }
}


package com.hk.eshop.proxy;

public class Main
{
    public static void main(String[] args)
    {
        Subject subject = new ProxySubject();
        String rtn = subject.request();
        System.out.println(rtn);
    }
}

动态代理

动态代理是在运行时动态扩展一个接口或一个类功能的技术。





java 复制代码
package com.hk.eshop.java;

public interface IUserMng {
    public void save(String id,String name);
    public void find(String id);
}

package com.hk.eshop.java;

public class UserMng implements IUserMng{
    public void save(String id, String name) {
        System.out.println("save() id="+id+",name="+name);
    }

    public void find(String id) {
        System.out.println("find() id="+id);
    }
}


package com.hk.eshop.java;


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

public class JdkProxy implements InvocationHandler {
    private Object targetObject;

    public Object createProxyInstance(Object targetObject)
    {
        this.targetObject = targetObject;
        return Proxy.newProxyInstance(
                targetObject.getClass().getClassLoader(),
                targetObject.getClass().getInterfaces(),
                this
        );
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if(method.getName().contains("save"))
            audit(method,args);
        Object rtn = null;
        rtn = method.invoke(this.targetObject,args);
        System.out.println("返回值:="+rtn);
        return rtn;
    }

    public void audit(Method method, Object[] args)
    {
        System.out.println("触发方法......"+method.getName());
        System.out.println("方法审计开始......");
        for(int i=1;i<=args.length;i++)
            System.out.println("第"+i+"个参数="+args[i-1]);
        System.out.println("方法审计结束......");
    }
}



package com.hk.eshop.java;

public class Main
{
    public static void main(String[] args)
    {
        IUserMng userMng = new UserMng();
        JdkProxy proxy = new JdkProxy();
        IUserMng userMng2 = (IUserMng)proxy.createProxyInstance(userMng);
        userMng2.find("1");
        userMng2.save("1","java");
    }
}




基于类的CgLib动态代理

CGlib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。

相关推荐
weixin_460443561 小时前
2026年新修订《网络安全法》实施:Java私有化考试系统如何做好SBOM、漏洞治理与安全升级?
java·开发语言·在线考试系统·企业培训考试系统·宏远培训考试系统·国企培训考试系统·国产化培训系统
子兮曰1 小时前
把 649 种文件格式塞进一个网页里:一个「文件不出浏览器」的预览器
前端·javascript·后端
海鸥-w4 小时前
什么是AOP
java
java资料站4 小时前
十一、Spring AI Alibaba · 高级 · 多智能体(Multi-agent)
人工智能·spring·microsoft
全栈弄潮儿4 小时前
Python实战第2期: 变量与数据类型
后端·python·agent
Cc.Y4 小时前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
paopaokaka_luck4 小时前
基于springboot+vue的智慧家政管理系统(AI问答、 WebSocket实时沟通、ECharts运营分析、订单规则与服务追踪)
java·javascript·spring boot·数据分析·echarts·mybatis
sm_926787054 小时前
RFID 标签打印的技术实现要点与二次开发实践
java·大数据·前端·c++·编辑器
阿森_dev4 小时前
2027 届毕设选题怎么选:30 个 Java 方向选题的实现难度排序
java·开发语言·spring boot·毕业设计·课程设计