与静态代理类对照的是动态代理类,动态代理类的字节码在程序运行时由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世界中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种设计模式,它允许程序员在不修改源代码的情况下,插入新的行为或增强已有功能。Spring框架是AOP实现的一个典范,它提供了两种主要的动态...
在Java中,我们可以使用JDK的动态代理或者Spring AOP来实现代理模式。 JDK动态代理主要依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。Proxy类是生成代理对象的工厂,而...
在Java中实现AOP可以通过动态代理模式,其中Java动态代理是一个非常重要的实现方式。 Java动态代理机制要求被代理的类必须实现至少一个接口,因为Java动态代理是通过JDK的java.lang.reflect.Proxy类和java.lang....
代理模式是一种设计模式,它允许我们在不修改原有对象的情况下,为对象添加新的功能或行为。在Java中,代理模式有多种实现方式,包括静态代理、JDK动态代理和CGLIB动态代理。 **静态代理** 静态代理是最早也是最...
在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者定义“切面”,这些切面可以包含业务逻辑的某一部分,比如日志、事务管理或安全控制。切面可以在多个对象中统一地应用,提高了代码的复用性...
在编程领域,面向切面编程(Aspect Oriented Programming,简称AOP)是一种设计模式,它旨在提高代码的可重用性和可维护性。AOP允许程序员定义“横切关注点”,如日志、事务管理、权限检查等,这些关注点会横切多个...
Java中有两种方式来实现动态代理,一种是使用JDK中的Proxy类,另一种是使用CGLIB库。使用JDK中的Proxy类,可以生成代理对象,并将其绑定到原始对象上。使用CGLIB库,可以生成代理对象,并将其绑定到原始对象上,同时...
在Java环境中实现AOP时,可以使用Java的动态代理机制。以下是一个简单的示例,展示了如何使用Java反射API实现AOP: ```java import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import...
代理模式是一种设计模式,它允许我们在不修改原有对象的情况下,为...动态代理在Java中广泛应用于AOP(面向切面编程)、ORM框架(如Hibernate)以及各种服务调用的拦截等场景,提供了一种灵活且强大的代码扩展机制。
在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者将关注点从核心业务逻辑中分离出来,例如日志记录、事务管理等。在本篇Spring学习笔记中,我们将探讨如何使用CGLIB库来实现AOP功能。 CGLIB...
Java JDK 动态代理是一种强大的特性,它允许我们在运行时创建代理对象,这些代理对象可以扩展或增强已存在的接口实现。动态代理在处理AOP(面向切面编程)场景、事件监听、性能监控等方面有着广泛的应用。下面我们将...
在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者将关注点分离,将横切关注点(如日志、事务管理、权限检查等)与核心业务逻辑解耦。AOP的核心概念是切面、通知、连接点、切入点和织入。在...
除了基本的代理实现,JDK动态代理还可以结合其他设计模式,如工厂模式,创建更加复杂的代理对象。此外,Spring框架中的AOP功能也是基于JDK动态代理或CGLIB实现的,它允许开发者定义切面,对满足特定条件的方法进行...
在Java编程中,AOP(面向切面编程)是一种设计模式,它允许程序员将关注点(如日志记录、性能监控、安全控制和事务管理)与核心业务逻辑分离,提高代码的可复用性和可维护性。AOP的核心概念是切面,它包含了关注点的...
Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建对象的代理,从而可以在不修改原有代码的情况下,对原有...同时,它也是设计模式中的代理模式的一种实现,有助于解耦系统组件,使代码结构更加清晰。
为了说明Spring的AOP原理,本人使用代理模式中的动态代理完成演示AOP编程的原理的演示。相信,如果你耐心看完整个程序(几乎一行注释一行代码),那么你对Spring这个东西就不是觉得有什么神秘了! 阅读对象:凡是喜爱...
在Java编程领域,代理模式是一种常见且重要的设计模式,它允许我们为一个对象提供一个代理以控制对该对象的访问。代理模式在实际应用中广泛用于数据缓存、权限控制、事务处理等方面。JDK和CGLIB是Java中实现动态代理...
Spring框架广泛使用了动态代理技术来实现面向切面编程(AOP)。通过Spring AOP,开发人员可以在不修改业务代码的情况下添加日志记录、事务管理等功能。Spring AOP支持基于JDK Proxy和CGLIB的动态代理。 - **基于JDK ...
Spring AOP则是一种设计模式,用于分离关注点,通过代理模式实现横切关注点,如日志、事务管理等。 首先,让我们理解反射的基础。在Java中,`java.lang.Class`类是所有类的通用表示,可以用于获取任何对象的类信息...