Java中的动态代理技术

1.什么是动态代理技术

1.1 动态代理技术是面向切面编程的一种思想(aop)。
1.2 思想模型
Snip20180601_19.png

2.动态代理技术的好处

可以动态的在B实现类的doSomething()方法前后,添加一些其他的操作方法。

3.案例讲解

3.1 场景模拟

在操作数据库之前,我们都需要开启事物,当操作完毕之后还要提交事物,但是如果在每一个操作数据库的方法中都要调用一次的话就会显得很繁琐了,所以我们在动态代理中统一进行处理。

3.2 代码演示

3.2.1 准备一个接口

public interface UserService {
    void save();
    void delete();
    void update();
    void find();
}

3.2.2 准备一个实现类

package cn.jianghai.service;

public class UserServiceImpl implements UserService{

    @Override
    public void save() {
        System.out.println("保存用户!");
    }
    @Override
    public void delete() {
        System.out.println("删除用户!");
    }
    @Override
    public void update() {
        System.out.println("更新用户!");
    }
    @Override
    public void find() {
        System.out.println("查找用户!");
    }
}

3.2.3 准备一个动态代理类

public class UserServiceProxyFactory implements InvocationHandler {

    private UserService userService;
    public UserServiceProxyFactory(UserService userService) {
        super();
        this.userService = userService;
    }


    public UserService getUserServiceProxy() {
        // 生成动态代理(这里需要一个任意的classLoader)
        ClassLoader classLoader = UserServiceProxyFactory.class.getClassLoader();
        // 实现类中的全部接口方法
        Class<?>[] classes = UserServiceImpl.class.getInterfaces();
        // 代理类是谁,那么这个invocationHandler 传的就是谁的实例
        InvocationHandler invocationHandler = this;
        // 返回的是接口的实现类
        UserService usProxy = (UserService)Proxy.newProxyInstance(classLoader, classes, invocationHandler);
        return usProxy;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("打开事务!");
        Object invoke = method.invoke(this.userService, args);
        System.out.println("提交事务!");
        return invoke;
    }
}

3.2.4 测试

public class Demo {

    @Test
    public void func() {

        UserService userService = new UserServiceImpl();
        UserServiceProxyFactory userServiceProxyFactory = new UserServiceProxyFactory(userService);
        UserService userServiceProxy = userServiceProxyFactory.getUserServiceProxy();
        userServiceProxy.save();
    }

}

查看测试结果


Snip20180601_20.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,997评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,779评论 18 399
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,647评论 8 265
  • 静恩阅读 244评论 0 0
  • 总想写点什么 是给自己看 同时也是给别人看 分享那些苦楚与欢乐 曾经有很喜欢一个人吗 有很恨一个人吗 有或无 那么...
    采兔子的小蘑菇阅读 240评论 0 1