Spring AOP 之CGLIB实例
使用的是CGLIB代理
1. Advice类要实现MethodInterceptor接口
2. 要自己定义一个代理工厂,用于配置target和Advice
业务类
package com.yeepay.porxy.cglib.test;
import java.util.HashMap;
import java.util.Map;
/**
* 目标类,(委托类)
* @author shangxiaofei
*
*/
public class PaymentServer {
public Map<String, String> payMoney(String name,Integer money){
System.out.println("paymentServer.payMoney()付钱=========>名字【"+name+"】,money=【"+money+"】");
Map<String, String> map=new HashMap<String, String>();
map.put("result", "已经完成付钱");
return map;
}
}
Advice类
package com.yeepay.porxy.cglib.test;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/**
* 增强类
* @author shangxiaofei
*
*/
public class PoxyForService implements MethodInterceptor{
@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2,MethodProxy arg3) throws Throwable {
// 增强功能的代码
System.out.println("PoxyForService.intercept(方法执行前执行========>向统计发送消息)");
if(arg2!=null&&arg2.length>0){
for(int i=0;i<arg2.length;i++){
System.out.println("PoxyForService.intercept()发送的参数内容====>"+arg2[i]);
}
}
//执行方法内容
Object object=arg3.invokeSuper(arg0, arg2);
System.out.println("PoxyForService.intercept(方法执行后执行=======>计算时间)");
return object;
}
}
代理的工厂类
package com.yeepay.porxy.cglib.test;
import net.sf.cglib.proxy.Enhancer;
/**
* 代理实现工厂类
* @author shangxiaofei
*
*/
public class PoxyFactory {
public static PaymentServer getPaymentServer(){
// Cglib 核心类,生成代理对象
Enhancer enhancer= new Enhancer();
// 为核心类对象中放入需要代理的委托类的类对象
enhancer.setSuperclass(PaymentServer.class);
// 为核心类对象中放入增强功能的类对象
enhancer.setCallback(new PoxyForService());
// 从核心类对象中获取委托类的代理对象
Object object=enhancer.create();
return (PaymentServer) object;
}
}
测试类
package com.yeepay.porxy.cglib.test;
import java.util.Map;
/**
* 测试类
* @author shangxiaofei
*
*/
public class TestController {
private PaymentServer paymentServer=PoxyFactory.getPaymentServer();
public void payment(){
System.out.println("TestController.payment()开始");
Map<String, String> map=paymentServer.payMoney("怪物雷克", 100);
System.out.println("TestController.payment()结束===>"+map.get("result"));
}
/**
* TestController.payment()开始
* PoxyForService.intercept(方法执行前执行========>向统计发送消息)
* PoxyForService.intercept()发送的参数内容====>怪物雷克
* PoxyForService.intercept()发送的参数内容====>100
* paymentServer.payMoney()付钱=========>名字【怪物雷克】,money=【100】
* PoxyForService.intercept(方法执行后执行=======>计算时间)
* TestController.payment()结束===>已经完成付钱
* @param args
*/
public static void main(String[] args) {
TestController testController=new TestController();
testController.payment();
}
}
相关推荐
1. **代理**:Spring AOP支持两种类型的代理:JDK动态代理和CGLIB代理。JDK代理用于实现了接口的类,而CGLIB代理则用于没有接口或不希望使用接口的类。代理对象在调用目标方法时会执行切面逻辑。 2. **织入**:织入...
通过以上介绍,我们可以看到Spring AOP的强大之处在于它简化了代码的组织和维护,使得横切关注点的实现更加优雅。了解并掌握这些概念,开发者可以有效地利用Spring AOP提升应用程序的可维护性和可扩展性。
**Spring AOP 使用实例** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要组成部分,它提供了一种在不修改原有代码的情况下,通过代理方式添加额外功能的技术。这种技术使得我们...
本实例将深入探讨如何在Spring 4.0版本中实现AOP。 首先,AOP的核心概念包括切面(Aspect)、通知(Advice)、连接点(Join Point)、切入点(Pointcut)和织入(Weaving)。切面是AOP中的一个模块,包含了一组相关...
本实例主要探讨如何在Spring AOP中实现拦截器。 首先,我们来理解Spring AOP的基本概念。AOP的核心是代理,Spring提供了两种代理方式:JDK动态代理和CGLIB代理。JDK动态代理基于接口,当目标对象实现了接口时使用;...
如果被代理的类没有实现接口,Spring AOP会采用CGLIB来生成代理对象。CGLIB(Code Generation Library)是一个开源的代码生成库,它允许运行时在内存中动态生成类和对象。 在Spring AOP中,我们通常使用@Aspect注解...
**Spring AOP学习实例** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。AOP允许开发者定义“切面”...
CGLIB是一个强大的高性能的代码生成库,它在许多AOP(面向切面编程)的实现中被使用,比如Spring AOP。CGLIB通过字节码操作技术,在运行时动态创建子类并增强方法。在Spring中,当目标对象不支持代理(如final类)...
5. **代理(Proxy)**:Spring AOP 使用动态代理技术创建对象,有两种代理方式:JDK 动态代理和 CGLIB 代理。前者适用于接口实现类,后者适用于没有接口的类。 6. **注解使用**:如 @Aspect、@Before、@After、@...
2. **动态代理**:Spring AOP 的默认代理方式是动态代理,它包括JDK动态代理和CGLIB代理。当目标对象实现了至少一个接口时,Spring将使用JDK的动态代理机制。JDK动态代理通过实现InvocationHandler接口,并在运行时...
在Spring中,动态代理是实现AOP(面向切面编程)的核心技术之一。CGLIB和Java的内置JDK动态代理是两种常用的动态代理方式。当目标类实现了接口时,Spring会选择JDK动态代理,通过反射机制创建代理对象;反之,如果...
Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的核心特性之一,它提供了一种在不修改原有代码的情况下,通过插入额外的行为(如日志、事务管理等)来增强功能的方式。AOP允许程序员定义“切...
在IT行业中,Spring框架是Java企业级应用开发的首选框架,而Spring AOP(面向切面编程)则是其核心特性之一。AOP提供了一种在不修改代码的情况下,对现有程序进行扩展和增强的能力,主要应用于日志记录、事务管理、...
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的一个重要组成部分。它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、事务管理、性能监控等,从而使得业务代码...
Spring AOP,全称为Aspect Oriented Programming,是Spring框架中的一个重要模块,主要负责处理系统中的...文件"5.SpringAOP_01"和"6.SpringAOP_02"很可能是课程的分阶段内容,涵盖了从基础概念到进阶实践的详细讲解。
Spring通过反射机制来实现这一过程,比如在上述的`TestIOC`例子中,Spring能够根据类名动态地创建对象,并通过setter方法注入属性值,实现了对象的实例化和配置。 **依赖注入(DI)**有多种实现方式,包括构造器...
**Spring AOP 简介** 面向切面编程(AOP),全称为 Aspect-Oriented Programming,是一种编程范式,旨在解决传统面向对象编程(OOP)中的代码重复和分散问题。在OOP中,诸如事务管理、日志记录等功能往往会分散在多...
**Spring AOP 入门实例1** 在Java开发中,Spring框架因其强大的功能和灵活性而备受推崇,其中Spring AOP(Aspect Oriented Programming,面向切面编程)是其重要组成部分。AOP允许开发者定义“切面”,这些切面可以...