动态代理和静态代理-java描述

6 篇文章 0 订阅

1.业务功能实现

package com.xxx.demo;

public class UserServiceImpl implements UserService {


    @Override
    public void add() {
        System.out.println("往数据库添加一条数据");

    }

    @Override
    public void delete() {
        System.out.println("删除数据库一条数据");
    }

    @Override
    public void update() {
        System.out.println("修改数据库一条数据");
    }

    @Override
    public void query(String m) {
        System.out.println("查询数据的数据");
    }
}

2.静态代理

2.1 静态代理实现
package com.xxx.demo;

/**
 * 静态代理:添加 一个log方法,不修改原来代码;开闭原则;AOP面向切面编程
 */
public class UserServiceProxy implements UserService {

    private UserService userService;

    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    @Override
    public void add() {
        log("add");
        userService.add();
    }

    @Override
    public void delete() {
        log("delete");
        userService.delete();
    }

    @Override
    public void update() {
        log("update");
        userService.update();
    }

    @Override
    public void query(String msg) {
        log("query");
        userService.query(msg);

    }

    public void log(String log){
        System.out.println("打印Log:"+log);
    }
}

2.2 静态代理测试
package com.xxx.demo;

import com.pfj.ProxyInvocationHandler;

public class Client {
    public static void main(String[] args) {
        UserService userService = new UserServiceImpl();
        // 代理类
        UserServiceProxy proxy = new UserServiceProxy();
        proxy.setUserService(userService);
        proxy.add();
        proxy.delete();
        proxy.query("查询");
        proxy.update();
    }
}

静态代理优点:

1.可以使真实角色更加纯粹,不用关心一些公共的业务
2.公共业务交给了代理角色,实现了业务分工
3.公共业务扩展的时候,方便集中管理
缺点:
一个角色就会产生一个代理角色;代码量翻倍,开发效率低

3.基于接口动态代理方式

3.1 代理模板
package com.xxx;
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 {
    	// 为所有方法扩展功能,这里只简单打印一下
        System.out.println("方法名:"+method.getName());
        // args : 方法入参集合
        if (args!=null) {
            System.out.println(args[0]);
        }
        // 动态代理的本质,就是使用反射机制实现的
        Object o = method.invoke(target, args);
        return o;
    }
}

3.2 测试
package com.xxx.demo;
import com.xxx.ProxyInvocationHandler;

public class Client {
    public static void main(String[] args) {
        UserService userService = new UserServiceImpl();
        ProxyInvocationHandler handler = new ProxyInvocationHandler();
        handler.setTarget(userService);// 设置代理对象
        // 动态生成代理类
        UserService proxy = (UserService) handler.getProxy();
        proxy.add();
        proxy.delete();
        proxy.query("查询");
        proxy.update();
    }
}
动态代理优点:

1.可以使真实角色更加纯粹,不用关心一些公共的业务
2.公共业务交给了代理角色,实现了业务分工
3.公共业务扩展的时候,方便集中管理
4.一个动态代理类代理一个接口,一般就是对应的一类业务(类的所有方法实现)
5.一个代理类可以代理多个类,只要是实现了同一个接口即可

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值