选自教学部金牌讲师;周周的自传体小说
我是一名自于 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();
一段小说描述一段人生,一段代码撰写一段精采。
天涯何处觅知音?
蹉跎岁月寻芳华,软件岁月找睿达!!!我在等你…
本文来自投稿,不代表中软睿达立场,如若转载,请注明出处:https://zrrd.net.cn/1069.html