Java代理模式

举报
波波烤鸭 发表于 2022/03/30 00:37:32 2022/03/30
【摘要】 代理模式   23中(Gof)中代理模式中的一种,AOP本身就是基于动态代理实现的,所以掌握了代理模式对AOP的学习很有帮助,所以先讲下代理模式 1.静态代理模式   若代理类在程序运行前就已经存在...

代理模式

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

1.静态代理模式

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

1.1 创建接口

/**
* 定义公共接口
* @author dpb[波波烤鸭]
*
*/
public interface SomeService {
   String doSome();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

1.2 创建接口实现类

/**
* 静态代理模式的实现类
* @author dpb[波波烤鸭]
*
*/
public class SomeServiceImpl implements SomeService{
   @Override
   public String doSome() {
   	// TODO Auto-generated method stub
   	return "hello";
   }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

1.3 创建静态代理类

/**
* 代理类
*    增强实现类
*    和实现类实现同一个接口
* @author dpb[波波烤鸭]
*
*/
public class SomeProxy implements SomeService{
   private SomeService target;
   public SomeProxy(SomeService target) {
   	super();
   	this.target = target;
   }
   /**
    * 增强方法
    *    将返回结果转换为大写
    */
   @Override
   public String doSome() {
   	return target.doSome().toUpperCase();
   }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

1.4 测试实现

   public static void main(String[] args) {
   	SomeService some = new SomeServiceImpl();
   	// 获取静态代理对象
   	SomeProxy proxy = new SomeProxy(some);
   	System.out.println(proxy.doSome());
   }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述

2.动态代理模式

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

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

2.1.JDK动态代理

声明接口

/**
 * 定义公共接口
 * @author dpb[波波烤鸭]
 *
 */
public interface SomeService {
	String doSome();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

创建实现类

/**
 * 静态代理模式的实现类
 * @author dpb[波波烤鸭]
 *
 */
public class SomeServiceImpl implements SomeService{
	@Override
	public String doSome() {
		// TODO Auto-generated method stub
		return "hello";
	}
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

JDK代理实现

public static void main(String[] args) {
	SomeService some = new SomeServiceImpl();
	// 获取静态代理对象
	SomeService proxy = (SomeService) Proxy.newProxyInstance(
			some.getClass().getClassLoader() // 实现类的类加载器
			, some.getClass().getInterfaces() // 实现类 实现的所有的接口
			, new InvocationHandler()  // 处理器
			{
				/**
				 * proxy 代理对象
				 * method 目标的方法
				 * args 目标方法的参数
				 */
				@Override
				public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
					String msg = (String) method.invoke(some, args);
					return msg.toUpperCase();
				}
			});
	System.out.println(proxy.doSome());

}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

在这里插入图片描述

2.2CGLIB动态代理

导入cglib的jar包

在这里插入图片描述

创建目标类

/**
 * 静态代理模式的实现类
 * @author dpb[波波烤鸭]
 *
 */
public class SomeServiceImpl {
	
	public String doSome() {
		// TODO Auto-generated method stub
		return "hello";
	}
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

创建cglib工厂

/**
 * cglib代理类
 * @author dpb[波波烤鸭]
 *
 */
public class CglibProxy implements MethodInterceptor{
	
	private SomeServiceImpl target;
	
	public CglibProxy(SomeServiceImpl target) {
		this.target = target;
	}

	/**
	 * 创建cglib代理对象的方法
	 * @return
	 */
	public SomeServiceImpl createProxy(){
		// 创建增强器
		Enhancer e = new Enhancer();
		// 指定父类
		e.setSuperclass(SomeServiceImpl.class);
		// 指定回调接口对象
		e.setCallback(this);
		// 创建cglib代理对象
		return (SomeServiceImpl) e.create();
	}

	/**
	 * 拦截方法
	 */
	@Override
	public Object intercept(Object obj, Method method, Object[] agrs, MethodProxy proxy) throws Throwable {
		String msg = (String)method.invoke(target, agrs);
		return msg.toUpperCase();
	}

}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

测试

public static void main(String[] args) {
	// 定义目标对象
	SomeServiceImpl some = new SomeServiceImpl();
	// 获取代理对象
	SomeServiceImpl proxy = new CglibProxy(some).createProxy();
	System.out.println(proxy.doSome());
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

文章来源: dpb-bobokaoya-sm.blog.csdn.net,作者:波波烤鸭,版权归原作者所有,如需转载,请联系作者。

原文链接:dpb-bobokaoya-sm.blog.csdn.net/article/details/86484887

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。