康说—JDK动态代理

原文地址https://zrrd.net.cn/1069.htm

我是一名自于 UserService 公司的老板,目前我们公司主营的四个业务是增删改查 ,我希望在每个业务执行之前都能鉴权,在每个业务之后都能打印日志,如果每个业务都手动添加这两套代码的话实在是太麻烦了,所以我想去代理公司,和他们谈谈合作。

经过高人的指点,我来到了一个僻静的小山村,映入眼帘的是两家代理公司,一家叫jdk动态代理公司,一家叫cglib动态代理公司,我准备先去jdk动态代理公司碰碰运气。

走进这家代理公司,迎面走出来一个人,满脸堆笑的对我说:“欢迎光临,这里是jdk代理公司,全名 JdkProxyCompany,我们公司是合理合法的正规公司,这是我们公司的营业证明,请问您是需要聘请代理帮您做事吗?”

说着,他拿出一个公司营业许可证明文件给我看,我看到如下内容:

public class JdkProxyCompany implements InvocationHandler{}

“是的,我是 UserService 公司的老板,想跟贵公司谈谈合作。”

“没问题,但是有一点我需要事先说明,我们公司有明文规定,只代理有接口的客户,因为我们的代理也需要来实现您的客户的接口,如果您的客户没有实现任何接口,请您出门左转,去隔壁cglib他们家聘用代理。”

“这个可以,我们公司都是接口加实现类的工作模式。” 我回答道。

“好的,接下来我会为您进行登记,请您编写一个召唤代理的咒语好吗?” 说着,他拿出一个本子,准备在上面写些什么。

“咒语的话,我觉得,要不然就叫 hireProxy() 吧!” 我回答道。

“没问题,对了,召唤代理的时候,您还需要告诉我们为您公司的哪位员工进行代理,因为他才是我们的具体的客户对象,我们也需要为他进行登记。” 说着,他在本上写下如下内容:

private Object customer; 
public Object hireProxy(Object customer){
    this.customer = customer;  
}

“接下来,我要为您编写这个咒语了,对了,召唤代理的时候,需要提供具体客户的类加载器和接口们,否则召唤不了代理哦,不要担心这个,就像您开房要提供身份证信息一样,我们也会为您保密这些信息的。” 说着,他在咒语的方法 hireProxy() 中又添加了如下内容:

return Proxy.newProxyInstance(
        customer.getClass().getClassLoader(),
        customer.getClass().getInterfaces(), this);

“好了,咒语已经编写完成了,以后想召唤代理的时候,您只需要喊出 hireProxy(),就可以召唤一个代理了,那么接下来,您需要提供一下代理的工作清单 invoke(),也就是告诉我们,您聘用代理,需要它们做些什么内容,您召唤的代理会按照这个清单一步一步执行的。”

“嗯,我需要这个代理在帮我做任何事之前,都能帮我鉴权,并且在做完事之后,帮我打印日志。”

“好的。” 说着他在 invoke() 中添加了如下内容:

System.out.println("鉴权...");
Object methodReturn = method.invoke(customer, args);
System.out.println("日志...");
return methodReturn;

我又问道:“需要我提前告诉您,我们要做的事情吗?”

“这个不需要,我们代理的工作模式是预编译,会自动在您使用代理的时候,通过反射的方式了解到您要做的业务方法,然后帮您去做( method.invoke()),但是每次都需要提供具体的客户和方法的参数,当然,最后我们会把业务方法的结果给您返回去。”

“哦,明白了。”

“好的,您的手续都已经全部都办理完了,您接下来可以找一名客户来测试一下了。”

我走出门,掏出电话,打给我们公司最勤劳的,也是专门负责增删改查的员工赵四,让它帮我试试代理好不好用。

“喂,老四啊,不用再自己添加前后方法了,我给你找了个代理,咒语是 hireProxy(),试试好不好使!”

// 我的员工[赵四]
UserService zhaosi = new UserServiceImpl();

赵四挂了电话之后找到一处空旷的地方大声喊出了咒语:hireProxy()!,突然砰的一声!身边多出一个人,居然跟赵四长得一模一样!

// 为赵四聘用一个代理,代理叫刘能
UserService liuneng = (UserService) new JdkProxyCompany().hireProxy(zhaosi);

这个人说道:“你好,我是你的代理,我叫刘能,你想要调用CRUD是吧?那么接下来,就交给我了!”

liuneng.insert();
liuneng.select();
liuneng.update();
liuneng.delete();

嗯!结果非常完美,赵四出色的完成了我布置的任务,哦不对,是他的代理刘能,出色的完成了我布置的任务。

一段小说描述一段人生,一段代码撰写一段精采。

天涯何处觅知音?

蹉跎岁月寻芳华,软件岁月找睿达!!!我在等你…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值