`
Supanccy2013
  • 浏览: 224960 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

阅读更多

    与静态代理类对照的是动态代理类,动态代理类的字节码在程序运行时由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
********
非事务方法调用结束
分享到:
评论

相关推荐

    AOP之JDK动态代理和CGLib动态代理

    在Java世界中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种设计模式,它允许程序员在不修改源代码的情况下,插入新的行为或增强已有功能。Spring框架是AOP实现的一个典范,它提供了两种主要的动态...

    代理模式,JDK动态代理,SpringAOP来龙去脉

    在Java中,我们可以使用JDK的动态代理或者Spring AOP来实现代理模式。 JDK动态代理主要依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。Proxy类是生成代理对象的工厂,而...

    java-用Java动态代理实现AOP.pdf

    在Java中实现AOP可以通过动态代理模式,其中Java动态代理是一个非常重要的实现方式。 Java动态代理机制要求被代理的类必须实现至少一个接口,因为Java动态代理是通过JDK的java.lang.reflect.Proxy类和java.lang....

    代理模式-静态动态代理-jdk动态代理-cglib动态代理

    代理模式是一种设计模式,它允许我们在不修改原有对象的情况下,为对象添加新的功能或行为。在Java中,代理模式有多种实现方式,包括静态代理、JDK动态代理和CGLIB动态代理。 **静态代理** 静态代理是最早也是最...

    模拟spring aop【一】基于jdk动态代理实现的aop

    在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者定义“切面”,这些切面可以包含业务逻辑的某一部分,比如日志、事务管理或安全控制。切面可以在多个对象中统一地应用,提高了代码的复用性...

    动态代理实现AOP机制

    在编程领域,面向切面编程(Aspect Oriented Programming,简称AOP)是一种设计模式,它旨在提高代码的可重用性和可维护性。AOP允许程序员定义“横切关注点”,如日志、事务管理、权限检查等,这些关注点会横切多个...

    Java Spring代理模式AOP-IOC分析

    Java中有两种方式来实现动态代理,一种是使用JDK中的Proxy类,另一种是使用CGLIB库。使用JDK中的Proxy类,可以生成代理对象,并将其绑定到原始对象上。使用CGLIB库,可以生成代理对象,并将其绑定到原始对象上,同时...

    Java JDK 实现AOP

    在Java环境中实现AOP时,可以使用Java的动态代理机制。以下是一个简单的示例,展示了如何使用Java反射API实现AOP: ```java import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import...

    java模式设计-代理模式之动态代理.ppt

    代理模式是一种设计模式,它允许我们在不修改原有对象的情况下,为...动态代理在Java中广泛应用于AOP(面向切面编程)、ORM框架(如Hibernate)以及各种服务调用的拦截等场景,提供了一种灵活且强大的代码扩展机制。

    Spring学习笔记(14)----使用CGLIB实现AOP功能

    在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者将关注点从核心业务逻辑中分离出来,例如日志记录、事务管理等。在本篇Spring学习笔记中,我们将探讨如何使用CGLIB库来实现AOP功能。 CGLIB...

    java jdk 动态代理 演示demo

    Java JDK 动态代理是一种强大的特性,它允许我们在运行时创建代理对象,这些代理对象可以扩展或增强已存在的接口实现。动态代理在处理AOP(面向切面编程)场景、事件监听、性能监控等方面有着广泛的应用。下面我们将...

    spring之AOP(动态代理)

    在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者将关注点分离,将横切关注点(如日志、事务管理、权限检查等)与核心业务逻辑解耦。AOP的核心概念是切面、通知、连接点、切入点和织入。在...

    JDK动态代理简单示例

    除了基本的代理实现,JDK动态代理还可以结合其他设计模式,如工厂模式,创建更加复杂的代理对象。此外,Spring框架中的AOP功能也是基于JDK动态代理或CGLIB实现的,它允许开发者定义切面,对满足特定条件的方法进行...

    用Java动态代理实现AOP

    在Java编程中,AOP(面向切面编程)是一种设计模式,它允许程序员将关注点(如日志记录、性能监控、安全控制和事务管理)与核心业务逻辑分离,提高代码的可复用性和可维护性。AOP的核心概念是切面,它包含了关注点的...

    java 动态代理实例(JDK代理与CGLIB代理)

    Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建对象的代理,从而可以在不修改原有代码的情况下,对原有...同时,它也是设计模式中的代理模式的一种实现,有助于解耦系统组件,使代码结构更加清晰。

    使用动态代理演示Spring的AOP编程原理

    为了说明Spring的AOP原理,本人使用代理模式中的动态代理完成演示AOP编程的原理的演示。相信,如果你耐心看完整个程序(几乎一行注释一行代码),那么你对Spring这个东西就不是觉得有什么神秘了! 阅读对象:凡是喜爱...

    jdk与cglib动态代理与底层实现

    在Java编程领域,代理模式是一种常见且重要的设计模式,它允许我们为一个对象提供一个代理以控制对该对象的访问。代理模式在实际应用中广泛用于数据缓存、权限控制、事务处理等方面。JDK和CGLIB是Java中实现动态代理...

    Java 代理 代理模式 静态代理与动态代理 常见的动态代理实现 .md

    Spring框架广泛使用了动态代理技术来实现面向切面编程(AOP)。通过Spring AOP,开发人员可以在不修改业务代码的情况下添加日志记录、事务管理等功能。Spring AOP支持基于JDK Proxy和CGLIB的动态代理。 - **基于JDK ...

    jdk6.0从入门到精通-----chapter16反射机制-spring AOP

    Spring AOP则是一种设计模式,用于分离关注点,通过代理模式实现横切关注点,如日志、事务管理等。 首先,让我们理解反射的基础。在Java中,`java.lang.Class`类是所有类的通用表示,可以用于获取任何对象的类信息...

Global site tag (gtag.js) - Google Analytics