当前位置:首页 > 开发 > 编程语言 > JDK JVM > 正文

java设计模式之--jdk动态代理(实现aop编程)

发表于: 2015-01-18   作者:Supanccy2013   来源:转载   浏览:
摘要:     与静态代理类对照的是动态代理类,动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。 &

    与静态代理类对照的是动态代理类,动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。
    但是,JDK的动态代理依靠接口实现,如果有些类并没有实现接口,则不能使用JDK代理,这就要使用cglib动态代理了。

    一下是jdk动态代理实例

一:接口
package com.supan.dao;
/**
 * <访问数据库dao层结果>
 */
public interface DaoInterface
{
	/**
	 * <增加>
	 */
	public void insert(String id, String name);

	/**
	 * <更新>
	 */
	public void update(String id, String name);
	
	/**
	 * <删除>
	 */
	public void delete(String id, String name);
	
	/**
	 * <查询>
	 */
	public void select(String id, String name);
}


二:实现类
package com.supan.dao.imp;
import com.supan.dao.DaoInterface;
public class PersonDaoImpl implements DaoInterface
{
	@Override
	public void insert(String id, String name)
	{
		System.out.println("********");
		System.out.println("增加");
		System.out.println(id);
		System.out.println(name);
		System.out.println("********");
	}

	@Override
	public void update(String id, String name)
	{
		System.out.println("********");
		System.out.println("更新");
		System.out.println(id);
		System.out.println(name);
		System.out.println("********");
	}

	@Override
	public void delete(String id, String name)
	{
		System.out.println("********");
		System.out.println("删除");
		System.out.println(id);
		System.out.println(name);
		System.out.println("********");
	}

	@Override
	public void select(String id, String name)
	{
		System.out.println("********");
		System.out.println("查询");
		System.out.println(id);
		System.out.println(name);
		System.out.println("********");
	}
}

 
三:实现jdk动态代理类的代理工厂
package com.supan.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * <该类是jdk动态代理模式中的核心类>
 * @author 陈超阳
 */
public class DaoProxyObject implements InvocationHandler
{
	/**该属性请用Object类型,通用性强*/
	private Object target;
	
	/**
	 * <该方法用来返回动态代理对象>
	 * @param target 目标对象
	 * @return  代理对象
	 */
	public Object bind(Object target)
	{
		this.target = target;
		return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
	}

	/**
	 * <动态代理必须要实现的方法,在该方法中可以实现AOP编程>
	 */
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable
	{
		Object result = null;
		
		if(method.getName().equals("update") || method.getName().equals("delete") && method.getName().equals("indeset"))
		{
			System.out.println("事务开始");
			method.invoke(target, args);
			System.out.println("事务结束");
		}
		else
		{
			System.out.println("非事务方法开始调用");
			result = method.invoke(target, args);
			System.out.println("非事务方法调用结束");
		}
		
		return result;
	}
}


四:测试
package com.supan.test;
import com.supan.dao.DaoInterface;
import com.supan.dao.imp.PersonDaoImpl;
import com.supan.proxy.DaoProxyObject;

public class MyDynaProxyTest
{
	public static void main(String[] args)
	{
		DaoProxyObject proxy = new DaoProxyObject();
		DaoInterface pd = (DaoInterface)proxy.bind(new PersonDaoImpl());
		pd.update("33", "chenchaoyang");
		pd.select("33", "dddd");
	}
}


五:输出结果
事务开始
********
更新
33
chenchaoyang
********
事务结束
非事务方法开始调用
********
查询
33
dddd
********
非事务方法调用结束

java设计模式之--jdk动态代理(实现aop编程)

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
先来看一下思维导图: 对于JDK的动态代理,孔浩老师说学习的方法是把它记下来。 先写一个主题接口类
JDK动态代理实现简单AOP JDK 动态代理是 java 反射的一个重要特性。它在某种方面为 java 提供了动态
JDK动态代理实现简单AOP http://blog.csdn.net/abing37/article/details/5449401 JDK 动态代理是 ja
一.概念 代理是什么呢?举个例子,一个公司是卖摄像头的,但公司不直接跟用户打交道,而是通过代理
一.概念 代理是什么呢?举个例子,一个公司是卖摄像头的,但公司不直接跟用户打交道,而是通过代理
Java之代理... 1 一. 概念... 1 二. jdk的静态代理... 1 三. jdk动态代理... 4 四. cglib 动态
Java之代理... 1 一. 概念... 1 二. jdk的静态代理... 1 三. jdk动态代理... 4 四. cglib 动态
JDK动态代理 在JDK 1.3以后提供了动态代理的技术,允许开发者在运行期创建接口的代理实例。在Sun刚
林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka 本文工程免费下载 一、JAVA
在上篇博客中,我们在宏观上介绍了AOP的底层实现,具体见博客java架构解密——Spring框架的AOP,在
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号