spring代理快速了解

静态代理

角色分析:

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

代理模式的好处:

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

先定义一个抽象的角色(基本逻辑增删改查)

public interface UserService {
	public void add();
	public void delete();
	public void update();
	public void query();
}
// 真实的对象
public class UserServiceImpl implements UserService {
    public void add(){
        System.out.println("增加操作")
    };
	public void delete(){
        System.out.println("删除操作") 
    };
	public void update(){
        System.out.println("修改操作")
    };
	public void query(){
        System.out.println("查询操作")
    };
}
public class Client {
    public static void main(String[] arg) {
        UserServiceImpl UserService = new UserServiceImpl();
        // UserService.add();
        // 实现下面的日志
        // 使用代理
        UserServiceProxy proxy = new UserServiceProxy();
        proxy.setUserService(UserService);
        
        proxy.add();
        
    }
}

在上面的业务中对添加一个日志业务

public class UserServiceProxy implements UserService {
    
    private UserServiceImpl userService;
    
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
    public void add(){
        log("add");
        userService.add();
    };
	public void delete(){
        log("delete");
        userService.delete();
    };
	public void update(){
        log("update");
        userService.update();
    };
	public void query(){
        log("query");
        userService.query();
    };
    
    //日志方法
    public void log(String msg) {
        System.out.println("使用了" + msg + "方法")
    }
}

缺点:

一个真实角色会产生一个代理角色;代码量会翻倍,开发效率会变低

动态代理

  • 动态代理和静态代理角色一样
  • 动态代理的代理类是动态生成的,不是直接写好的
  • 动态代理分为两大类:
    • 基于接口 — JDK 动态代理
    • 基于类: cglib
    • java字节码实现: javasist

了解的两个类:Prixy, InvocationHandler

InvocationHandler

image-20210617214548162

Proxy

image-20210617214655281

image-20210617214901983

// 用这个类,自动生成代理类
public class ProxyInvocationHandle implements InvocationHandler {
    
    // 被代理的接口
    private Object target;
    
    public void setRent(Rent rent)} {
    	this.target = target;
	}
    
    // 生成得到代理类
    public Object getProxy() {
        return Proxy.newProxyInstance(this.getclass().getClassLoader(),target.getClass().getInterfaces,this)
    }
    
	// 处理代理实例,并返回结果
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        
        
        Object result = method.invoke(target, args);
        return result;
    }
}

完成可以当作代理模板去使用,动态代理的本质,就是使用反射机制实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值