程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

【Spring】代理模式:动态代理

发布于2021-05-29 19:33     阅读(1105)     评论(0)     点赞(23)     收藏(0)


  • 动态代理和静态代理角色一样
  • 动态代理的代理类是动态生成的,不是我们直接写好的。
  • 动态代理分为两大类:基于接口的动态代理,基于类的动态代理。
    • 基于接口的——JDK动态代理
    • 基于类:cglib
    • java字节码实现:JAVAssist

Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru Chiba (千叶 滋)所创建的。它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态"AOP"框架。javassist是jboss的一个子项目,其主要的优点,在于简单,而且快速。直接使用java编码的形式,而不需要了解虚拟机指令,就能动态改变类的结构,或者动态生成类。

需要了解两个类

  • Proxy:代理

public class Proxy

Proxy提供了创建动态代理类和实例的静态方法,它也是由这些方法创建的所有动态代理类的超类。

  • InvocationHandler:调用处理程序

public interface InvocationHandler

InvocationHandler是由代理实例的调用处理程序实现的接口。

每个代理实例都有一个关联的调用处理程序。当在代理实例上调用方法时,方法调用将被编码并分配到齐调用处理程序的invoke方法。

动态代理的优点:

  • 可以使真实角色的操作更加纯粹,不用去关注一些公共的业务
  • 公共业务就交给了代理角色,实现了业务的分工
  • 公共业务发展扩展的时候,方便集中管理
  • 一个动态代理类代理的是一个接口,一般就是对应的一类业务
  • 一个动态代理类可以代理多各类,只要实现了同一个接口即可!

 

下面是一个动态代理的例子,仍然使用比较熟悉的例子(这里只用Demo3

UserService.java

  1. package Demo3;
  2. public interface UserService {
  3. public void add();
  4. public void delete();
  5. public void update();
  6. public void query();
  7. }

UserServiceImpl.java

  1. package Demo3;
  2. public class UserServiceImpl implements UserService {
  3. public void add() {
  4. System.out.println("增加了一个用户");
  5. }
  6. public void delete() {
  7. System.out.println("删除了一个用户");
  8. }
  9. public void update() {
  10. System.out.println("修改了一个用户");
  11. }
  12. public void query() {
  13. System.out.println("查询了一个用户");
  14. }
  15. }

ProxyInvocationHandler.java

  1. package Demo3;
  2. import java.lang.reflect.InvocationHandler;
  3. import java.lang.reflect.Method;
  4. import java.lang.reflect.Proxy;
  5. // 我们会用这个类,自动生成代理类!
  6. public class ProxyInvocationHandler implements InvocationHandler {
  7. // 被代理的接口
  8. private Object target;
  9. public void setTarget(Object target){
  10. this.target = target;
  11. }
  12. //生成得到代理类
  13. public Object getProxy(){
  14. return Proxy.newProxyInstance(this.getClass().getClassLoader(),
  15. target.getClass().getInterfaces(), this);
  16. }
  17. // 处理代理实例,并返回结果
  18. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  19. log(method.getName()); // 反射
  20. // 动态代理的本质,就是使用反射机制实现!
  21. Object result = method.invoke(target, args);
  22. return result;
  23. }
  24. public void log(String msg){
  25. System.out.println("loginfo: 执行了" + msg + "方法");
  26. }
  27. }

Client.java

  1. package Demo3;
  2. public class Client {
  3. public static void main(String[] args) {
  4. // 真实角色
  5. UserServiceImpl userService = new UserServiceImpl();
  6. // 代理角色,不存在
  7. ProxyInvocationHandler pih = new ProxyInvocationHandler();
  8. pih.setTarget(userService); // 设置要代理的对象
  9. // 动态生成代理类
  10. UserService proxy = (UserService) pih.getProxy();
  11. proxy.delete();
  12. }
  13. }

 

原文链接:https://blog.csdn.net/Aibiabcheng/article/details/117339565



所属网站分类: 技术文章 > 博客

作者:黑暗之神

链接:http://www.javaheidong.com/blog/article/207109/e2a4fefad7ff2304b2cf/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

23 0
收藏该文
已收藏

评论内容:(最多支持255个字符)