Java代理模式

绝地灬酷狼 2022-02-17 00:53 227阅读 0赞

Java代理模式

  1. 23中(Gof)中代理模式中的一种,AOP本身就是基于动态代理实现的,所以掌握了代理模式对AOP的学习很有帮助,所以先讲下代理模式

1.静态代理模式

如果代理类在程序运行前就已经存在,那么这种代理方式被成为 静态代理,这种情况下的代理类通常都是我们在java代码中定义的。通常情况下,静态代理中的代理类和目标类会实现同一接口或是派生自相同的父类。

1.1创建接口

  1. package com.sxt.dao;
  2. public interface IUserDao {
  3. void run(String msg);
  4. }

1.2创建接口实现类

  1. package com.sxt.dao.impl;
  2. import com.sxt.dao.IUserDao;
  3. public class UserDaoImpl implements IUserDao{
  4. @Override
  5. public void run(String msg) {
  6. System.out.println("周杰伦:"+msg);
  7. }
  8. }

1.3创建静态代理模式

  1. package com.sxt.proxy;
  2. import com.sxt.dao.IUserDao;
  3. import com.sxt.dao.impl.UserDaoImpl;
  4. public class ProxyStatice implements IUserDao{
  5. public IUserDao user;
  6. public ProxyStatice(IUserDao user) {
  7. super();
  8. this.user = user;
  9. }
  10. @Override
  11. public void run(String msg) {
  12. System.out.println("--目标对象执行之前--");
  13. // 目标对象增强
  14. msg = msg.toUpperCase();
  15. // 执行目标对象的方法
  16. user.run(msg);
  17. System.out.println("--目标对象执行之后--");
  18. }
  19. }

1.4测试实现

  1. \package com.sxt;
  2. import com.sxt.dao.IUserDao;
  3. import com.sxt.dao.impl.UserDaoImpl;
  4. import com.sxt.proxy.ProxyStatice;
  5. public class Test {
  6. public static void main(String[] args) {
  7. // 1.获取目标对象
  8. IUserDao user = new UserDaoImpl();
  9. // 2.获取代理类增强目标类
  10. ProxyStatice x =new ProxyStatice(user);
  11. // 3.执行业务
  12. x.run("hello");
  13. }
  14. }

在这里插入图片描述

2.动态代理模式

代理类在程序运行时创建的代理方式被称为 动态代理。 也就是说,在这种情况下,代理类并不是在java代码中定义的,而是在运行时根据我们在java代码中的”指示”动态生成的。


















代理类型 使用场景
JDK动态代理 如果目标对象实现了接口,采用JDK的动态代理
cglib动态代理 如果目标对象没有实现接口,必须采用cglib动态代理

2.1JDK动态代理

声明接口

  1. package com.sxt.dao;
  2. public interface IUserDao {
  3. void run(String msg);
  4. }

创建实现类

  1. package com.sxt.dao.impl;
  2. import com.sxt.dao.IUserDao;
  3. public class UserDaoImpl implements IUserDao{
  4. @Override
  5. public void run(String msg) {
  6. System.out.println("周杰伦:"+msg);
  7. }
  8. }

JDK动态代理shixian

  1. package com.sxt;
  2. import java.lang.reflect.InvocationHandler;
  3. import java.lang.reflect.Method;
  4. import java.lang.reflect.Proxy;
  5. import com.sxt.dao.IUserDao;
  6. import com.sxt.dao.impl.UserDaoImpl;
  7. public class Test {
  8. public static void main(String[] args) {
  9. // 1.获取目标对象
  10. IUserDao user = new UserDaoImpl();
  11. // 2.获取代理类增强目标类
  12. IUserDao object = (IUserDao) Proxy.newProxyInstance(user.getClass().getClassLoader()//实现类加载器
  13. , user.getClass().getInterfaces()//实现类的所有接口
  14. , new InvocationHandler() {//处理器
  15. @Override
  16. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  17. System.out.println("处理前");
  18. String msg =args[0].toString().toUpperCase();
  19. method.invoke(user, msg);
  20. System.out.println("处理后");
  21. return null;
  22. }
  23. }
  24. );
  25. object.run("hello");
  26. }
  27. }

测试实现

在这里插入图片描述

2.2CGLIB动态代理

导入cglibjar包

在这里插入图片描述

创建目标类

  1. package com.sxt.dao.impl;
  2. public class UserDaoImpl{
  3. public void run(String msg) {
  4. System.out.println("周杰伦:"+msg);
  5. }
  6. }

创建cglib工厂

  1. package com.sxt.cglib;
  2. import java.lang.reflect.Method;
  3. import com.sxt.dao.impl.UserDaoImpl;
  4. import net.sf.cglib.proxy.Enhancer;
  5. import net.sf.cglib.proxy.MethodInterceptor;
  6. import net.sf.cglib.proxy.MethodProxy;
  7. /**
  8. * cglib代理类
  9. * @author Administrator
  10. *
  11. */
  12. public class Cglib implements MethodInterceptor{
  13. private UserDaoImpl user;
  14. public Cglib(UserDaoImpl user) {
  15. super();
  16. this.user = user;
  17. }
  18. public UserDaoImpl newProxy(){
  19. //1.创建Enhancerd对象
  20. Enhancer e = new Enhancer();
  21. //2.指定父类方法
  22. e.setSuperclass(UserDaoImpl.class);
  23. //3.设置回调方法
  24. e.setCallback(this);
  25. return (UserDaoImpl) e.create();
  26. }
  27. @Override
  28. public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
  29. System.out.println("--cglib 执行之前-");
  30. String msg = arg2[0].toString().toUpperCase();
  31. arg1.invoke(user, msg);//执行目标对象的方法
  32. System.out.println("--cglib 执行之后-");
  33. return null;
  34. }
  35. }

测试

  1. package com.sxt;
  2. import com.sxt.cglib.Cglib;
  3. import com.sxt.dao.impl.UserDaoImpl;
  4. public class Test {
  5. public static void main(String[] args) {
  6. // 1.获取目标对象
  7. UserDaoImpl user = new UserDaoImpl();
  8. // 2.获取代理类增强目标类
  9. UserDaoImpl proxy = new Cglib(user).newProxy();
  10. proxy.run("hello");
  11. }
  12. }

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,227人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java】——代理模式

    前提     不知道大家是否看过《大话设计模式》,其中大话设计模式中讲代理模式的故事感觉还是很搞笑的,自己想追求女朋友,但却请朋友代劳,结果变成了朋友和期待的女朋友在

    相关 Java--代理模式(动态代理

    Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实

    相关 Java 代理模式

    第一种:静态代理 核心作用:通过代理,控制对对象的访问。 使用范围:在代码变异期间,就明确的知道的被代理的是哪个类,此时可以用静态代理 核心角色: 1.抽象角色:定义代

    相关 Java代理模式

    Java代理模式 23中(Gof)中代理模式中的一种,AOP本身就是基于动态代理实现的,所以掌握了代理模式对AOP的学习很有帮助,所以先讲下代理模式 1.静态

    相关 java 代理模式

    代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。 简言之,代理