JDK动态代理

原创 2016年08月28日 16:16:03

由于静态代理的局限性,dao层的变动会导致拦截器的变动,由此带来的一系列框架上的修改,这种缺陷无疑是十分致命的,于是动态代理应运而生。

动态代理通过反射机制实现对dao功能的加载。

应用场景:大量方法需要进行一些公共的操作,比如增删改查前的日志记录、权限验证等。这些代码全放在一个方法中完成的话,会有很多重复性的地方,且不易维护。

Spring AOP(面向切面编程)使用的也是这一技术。

示例场景:用户注册登录前进行权限检查,完成后进行日志记录(通过控制台模拟)

代码示例:

1. 用户注册和登录的功能接口

package jj.DynamicProxy;

public interface UserDao {
	abstract void regist(String user,String pd);
	abstract void login();
}

2. 注册和登录接口的实现

package jj.DynamicProxy;

public class UserDaoImpl  implements UserDao{

	@Override
	public void regist(String user,String pd) {
		System.out.println("正在注册账号。。。for " + user);
	}

	@Override
	public void login() {
		System.out.println("正在登陆账号。。。");
	}
	
}
3.  定义拦截器

package jj.DynamicProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class MyInvocationHandler implements InvocationHandler{
	private Object target;
	public MyInvocationHandler(Object target) {
		this.target = target;
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("权限检查。。。");
		method.invoke(target, args);
		System.out.println("日志记录。。。");
		return null;
	}

}

4.测试类

package jj.DynamicProxy;

import java.lang.reflect.Proxy;

public class TestProxy {
	public static void main(String[] args) {
		UserDaoImpl ui = new UserDaoImpl();
		MyInvocationHandler myHandler = new MyInvocationHandler(ui);
		//返回一个指定接口的代理类实例
		UserDao dao= (UserDao)Proxy.newProxyInstance(ui.getClass().getClassLoader(), ui.getClass().getInterfaces(), myHandler);
		dao.regist("jj","123");
		dao.login();
		
	}
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

Java动态代理(JDK和cglib)

  • 2017年07月04日 21:10
  • 246KB
  • 下载

jdk动态代理技术详解

  • 2013年06月30日 13:59
  • 101KB
  • 下载

Java动态代理模式jdk和cglib的2种实现以及二者的区别(AOP面向切面的前奏)

关于动态代理模式里面有两种实现,一种是jdk实现,一种是cglib来实现。 下面来整jdk来实现动态代理的Java实例。 jdk动态代理模式里面有个拦截器的概念,在jdk中,只要实现了Invocati...

jdk动态代理

  • 2014年06月13日 11:40
  • 8KB
  • 下载

java jdk 动态代理演示demo

  • 2016年08月07日 17:14
  • 18KB
  • 下载

Java JDK 动态代理(AOP)使用及实现原理分析

一、什么是代理? 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理...

JDK动态代理源码

  • 2016年11月30日 14:10
  • 2KB
  • 下载

Java设计模式(七) Spring AOP JDK动态代理 VS. cglib

Spring的AOP有JDK动态代理和cglib两种实现方式。JDK动态代理要求被代理对象实现接口;cglib通过动态继承实现,因此不能代理被final修饰的类;JDK动态代理生成代理对象速度比cgl...
  • Habren
  • Habren
  • 2016年05月06日 07:49
  • 802
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JDK动态代理
举报原因:
原因补充:

(最多只允许输入30个字)