* 模拟了给方法加入事务过程
接口------>
package com.xx.service;
public interface ProductService {
public void save();
public void get();
public void update();
}
实现类------>
package com.xx.service.impl;
import com.xx.service.ProductService;
public class ProductServiceBean implements ProductService {
public void get() {
System.out.println("这是get方法");
}
public void save() {
System.out.println("这是save方法");
}
public void update() {
System.out.println("这是update方法");
}
}
动态代理类工厂------>
package com.xx.proxyFactory;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import com.sun.corba.se.spi.orbutil.fsm.Guard.Result;
import com.sun.org.apache.bcel.internal.generic.NEW;
import com.xx.service.ProductService;
import com.xx.service.impl.ProductServiceBean;
/**
* 执行过程
* 1 传入目标对象;
* 2、根据目标对象生成代理对象;
* 3、代理对象的方法是目标对象的方法经过invoke方法返回的代理方法,
* 4、返回代理对象,客户端调用的方法是代理方法(相当于把目标对象的方法单独处理了一下);
*
*/
public class ProxyFactory implements InvocationHandler {
private Object tarObject;//目标对象
public Object getPropxy(Object targetObj){
this.tarObject = targetObj;
//生成代理对象
return Proxy.newProxyInstance(targetObj.getClass().getClassLoader(),
targetObj.getClass().getInterfaces(),
this);
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = null; //代理的方法,并将代理方法返回
before();
result = method.invoke(tarObject, args);
end();
return result;
}
public void before(){
System.out.println("-------事务开始--------");
}
public void end(){
System.out.println("-------事务结束--------");
}
}
客户端------>
package junit.test;
import org.junit.BeforeClass;
import org.junit.Test;
import com.xx.proxyFactory.ProxyFactory;
import com.xx.service.ProductService;
import com.xx.service.impl.ProductServiceBean;
public class TestProduct {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@Test
public void testGet(){
ProductService productService = (ProductService)new ProxyFactory().getPropxy(new ProductServiceBean());
productService.get();
}
}
分享到:
相关推荐
这种通过代理模式实现的AOP方法,可以很好地将业务逻辑代码与额外的横切关注点分离,使得代码更加清晰,易于维护。如果将来需要去除日志记录功能,只需要替换掉代理类的实例,而不需要修改任何业务逻辑代码。此外,...
JDK Proxy是Java提供的一种动态代理机制,它是实现AOP的一种方式。通过JDK Proxy,我们可以在运行时创建一个接口的实现类,并在调用接口方法时插入自定义的处理逻辑,这就是AOP的核心思想——“织入”(Weaving)。...
为了说明Spring的AOP原理,本人使用代理模式中的动态代理完成演示AOP编程的原理的演示。相信,如果你耐心看完整个程序(几乎一行注释一行代码),那么你对Spring这个东西就不是觉得有什么神秘了! 阅读对象:凡是喜爱...
在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者定义“切面”,...通过理解JDK动态代理的工作原理和Spring AOP的相关概念,我们可以更好地利用这一强大功能,提升应用程序的可维护性和灵活性。
在实际开发中,如Spring AOP框架就同时支持JDK和CGLIB动态代理,根据目标类是否实现接口自动选择合适的代理方式。 总结来说,JDK动态代理和CGLIB动态代理都是为了在运行时提供对目标对象的增强,它们通过不同的实现...
Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建对象的代理,从而可以在不修改原有代码的情况下,对原有...同时,它也是设计模式中的代理模式的一种实现,有助于解耦系统组件,使代码结构更加清晰。
在Java中实现AOP可以通过动态代理模式,其中Java动态代理是一个非常重要的实现方式。 Java动态代理机制要求被代理的类必须实现至少一个接口,因为Java动态代理是通过JDK的java.lang.reflect.Proxy类和java.lang....
### Java JDK 实现AOP详解 #### AOP的起源与发展 面向方面编程(Aspect-Oriented ...Java JDK 提供了强大的工具支持AOP的实现,通过学习并实践上述示例,开发者可以更好地理解AOP的工作原理及其在实际场景中的应用。
JDK和CGLIB是Java中实现动态代理的两种主要方式,它们在Spring框架中扮演着关键角色,尤其是在AOP(面向切面编程)中。 1. **JDK动态代理**: JDK动态代理基于Java的接口机制实现,因此,要使用JDK动态代理,被...
总结来说,AOP的实现机制主要涉及切面、连接点、通知等概念,以及静态代理和动态代理的实现方式。在Spring框架中,AOP通过代理类和切点匹配来实现通知的自动插入,从而达到关注点分离的效果,提高了代码的可维护性和...
**AOP(面向切面编程)**...Spring AOP提供了动态和静态两种代理方式,以及丰富的通知类型,方便我们在系统中灵活地实现切面逻辑,如日志记录。通过理解并熟练运用AOP,可以更好地设计和构建高效、整洁的Java应用程序。
在Java编程领域,动态代理是一种常见的设计模式,用于在运行时创建对象的代理,以便在调用实际目标方法之前或之后插入额外的行为。主要存在两种常见的动态代理技术:JDK动态代理和CGLIB(Code Generation Library)...
Spring AOP主要基于两种代理模式来实现:静态代理和动态代理。 1. 静态代理: 在静态代理中,代理类和目标类需要实现相同的接口,代理类持有目标类的引用,并在调用目标类方法前后添加额外的逻辑,比如日志记录。...
Spring AOP通过代理模式来实现切面的插入。 2. **基于XML的AOP实现** 在XML配置中,可以通过`<aop:config>`标签定义切面,`<aop:pointcut>`定义连接点,`<aop:advisor>`或`<aop:aspect>`定义通知。通过`<aop:...
除了基本的代理实现,JDK动态代理还可以结合其他设计模式,如工厂模式,创建更加复杂的代理对象。此外,Spring框架中的AOP功能也是基于JDK动态代理或CGLIB实现的,它允许开发者定义切面,对满足特定条件的方法进行...
学习这些示例,你可以更深入地理解Spring AOP的工作原理,掌握如何使用动态代理和责任链模式来编写切面,以及如何通过注解简化AOP的配置和使用。这些知识对于任何涉及Spring框架的开发者来说都是至关重要的,因为...
在Java中,代理模式有两种实现方式:静态代理和动态代理。 **静态代理** 在静态代理中,我们需要创建一个代理类,该类与被代理类具有相同的接口,以便在代理类中调用被代理类的方法。代理类中通常会添加额外的功能...
InvocationHandler接口中仅定义了一个方法Object invoke(Object obj,Method method,Object[] args),该方法在代理类中动态实现。在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,args为该方法的...