惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MyScale Blog
MyScale Blog
T
The Blog of Author Tim Ferriss
博客园 - 三生石上(FineUI控件)
博客园_首页
WordPress大学
WordPress大学
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
The GitHub Blog
The GitHub Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
F
Fortinet All Blogs
B
Blog RSS Feed
Stack Overflow Blog
Stack Overflow Blog
Microsoft Security Blog
Microsoft Security Blog
雷峰网
雷峰网
GbyAI
GbyAI
M
MIT News - Artificial intelligence
I
InfoQ
阮一峰的网络日志
阮一峰的网络日志
Recent Announcements
Recent Announcements
小众软件
小众软件
量子位
S
SegmentFault 最新的问题
Google DeepMind News
Google DeepMind News
Vercel News
Vercel News
aimingoo的专栏
aimingoo的专栏

博客园 - 翔宇编程

记账本app(一) 微信公众号测试账号获取授权须关注 docker images存放路径指定 mysql8采用caching-sha2-password加密 JAVA程序员常用开发工具 云计算之概念——IaaS、SaaS、PaaS、Daas Scrapy框架Windows下安装 Tomcat启动阻塞变慢 Eclipse编码格式 eclipse tomcat jdk 版本引用 Java不带.classpath的svn项目下载,转成到eclipse中 Eclipse 中 SVN 提交过滤 eclipse 实用快捷键(最全) 加密算法IV的作用 Hadoop环境常用命令 Centos网络配置 apache指定的网络名不再可用 Toritoisegit记住用户名密码 微信接入
设计模式之动态代理模式
翔宇编程 · 2020-03-04 · via 博客园 - 翔宇编程

  代理模式分动态和静态两种,下面重点理解动态代理:

JDK动态代理是通过Java反射机制动态的为具体实现生成代理类,从而实现委托事务。代理类不实现具体业务,只是为委托类进行预处理消息、过滤消息,然后再把消息传递给委托类,由委托类进行具体实现。

下面通过一个简单的示例来展示动态代理的具体实现。

1、首先定义接口

UserService
public interface UserService {
    public void select();
    public void update();
}

2、实现接口类

UserServiceImp
public class UserServiceImp implements UserService {
    private static final String TAG = "UserServiceImp";

    @Override
    public void select() {
        System.out.println(" 具体查询的实现在此... ");
    }

    @Override
    public void update() {
        System.out.println(" 具体更新的实现在此... ");

    }
}

3、实现

InvocationHandler

public class ProxyHandler implements InvocationHandler {
    private Object object ;

    public  ProxyHandler(Object object){
        this.object =object;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Before invoke "  + method.getName()+" at time "+ System.currentTimeMillis());
        method.invoke(object, args);
        System.out.println("After invoke " + method.getName()+" at time "+ System.currentTimeMillis());
        return null;
    }

4、调用代理

Proxy

    public static void main(String[] args) {


        System.getProperties().setProperty("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");

        UserService hello = new UserServiceImp();

        InvocationHandler handler = new ProxyHandler(hello);

        UserService proxyHello = (UserService) Proxy.newProxyInstance(hello.getClass().getClassLoader(), hello.getClass().getInterfaces(), handler);

        proxyHello.select();
        proxyHello.update();
}

结果输出:

Before invoke select at time 1583291583921
 具体查询的实现在此... 
After invoke select at time 1583291583921
Before invoke update at time 1583291583921
 具体更新的实现在此... 
After invoke update at time 1583291583921
通常我们通过代理实现对系统调用的性能指标进行监控,为了将非业务逻辑与业务逻辑解耦,如果使用Spring框架,使用AOP更加方便,AOP底层就是JDK或CGLIB动态代理实现的。