`
yunmanfan
  • 浏览: 94013 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

05-11 cglib实现AOP(转)

阅读更多
CGLib与java标准库提供的实现方案不同,cglib主要是基于实现类(如StudentInfoServiceImpl.java)扩展一个子类 来实现。与Dynamic Proxy中的Proxy和InvocationHandler相对应,net.sf.cglib.proxy.Enhancer和 MethodInterceptor在CGLib中负责完成代理对象创建和方法截获处理,产生的是目标类的子类而不是通过接口来实现方法拦截的, Enhancer主要是用于构造动态代理子类来实现拦截,MethodInterceptor(扩展了Callback接口)主要用于实现around advice(AOP中的概念):

1)我们的业务处理(StudentInfoServiceImpl.java):
public class StudentInfoServiceImpl{
 public void findInfo(String name){
  System.out.println("你目前输入的名字是:"+name);
 }
}
     2)实行一个工具来处理日志功能(AOPInstrumenter.java):
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
import org.apache.log4j.Logger;

public class AOPInstrumenter implements MethodInterceptor{
 private Logger log=Logger.getLogger(AOPInstrumenter.class);
 private Enhancer enhancer=new Enhancer();
 
 public Object getInstrumentedClass(Class clz){
  enhancer.setSuperclass(clz);
  enhancer.setCallback(this);
  return enhancer.create();
 }
 
 public Object intercept(Object o,Method method,Object[] args,MethodProxy proxy) throws Throwable{
  log.info("调用日志方法"+method.getName());
  Object result=proxy.invokeSuper(o,args);
  return result;
 }
 
}
     3)我们来测试一下(AOPTest.java):
public class AOPTest{
 public static void main(String[] args){
  AOPInstrumenter instrumenter=new AOPInstrumenter();
  StudentInfoServiceImpl studentInfo=(StudentInfoServiceImpl)instrumenter.getInstrumentedClass(StudentInfoServiceImpl.class);
  studentInfo.findInfo("阿飞");
 }
}
   输出结果与以上相同。
 CGLib中为实现以上目的,主要提供的类
1)Enhancer:setCallback(Callback) ,setSuperclass(Class) ,create()返回动态子类Object
2)MethodInterceptor必须实现的接口:intercept(Object,Method,Object[],MethodProxy)返回的是原方法调用的结果。和Proxy原理一样

分享到:
评论

相关推荐

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

    在本篇Spring学习笔记中,我们将探讨如何使用CGLIB库来实现AOP功能。 CGLIB(Code Generation Library)是一个强大的高性能的代码生成库,它被广泛用于动态代理和运行时织入AOP切面。在Spring中,如果目标类没有...

    AOP使用CGLIB实现AOP功能

    Spring AOP实现方法之一:CGLIB 实现AOP功能

    spring-cglib-repack-3.2.0.jar和spring-objenesis-repack-2.1.jar

    Spring使用CGILib作为其代理实现的一部分,特别是在进行代理代理时,如事务管理、AOP切面等。 其次,`spring-objenesis-repack-2.1.jar`则是关于Objenesis库。Objenesis是一个轻量级库,用于在Java中快速实例化无参...

    使用JDK中的Proxy技术实现AOP功能与使用CGLIB实现AOP功能

    本篇将深入探讨如何使用JDK的动态代理和CGLIB库来实现Spring中的AOP功能。 首先,我们来看JDK中的Proxy技术。JDK Proxy是Java提供的一种动态代理机制,它允许我们在运行时创建一个实现了特定接口的新类。这个新类...

    spring-cglib-repack-3.2.4.jar和spring-objenesis-repack-2.5.1.jar

    当Spring框架在进行AOP代理时,如果目标类没有实现接口,它会选择使用CGLIB来创建一个子类并动态地插入拦截器方法。CGLIB通过字节码操作技术生成代理类,这样就可以在运行时扩展或修改已有类的功能,而无需修改原始...

    spring-cglib-repack-3.2.5.jar,spring-objenesis-repack-2.6.ja及ck-2.5.1.jar

    CGLIB是一个强大的高性能的代码生成库,它在许多AOP(面向切面编程)的实现中被使用,比如Spring AOP。CGLIB通过字节码操作技术,在运行时动态创建子类并增强方法。在Spring中,当目标对象不支持代理(如final类)...

    spring----AOP实现

    Spring AOP实现详解 在Java开发中,Spring框架以其强大的功能和灵活性被广泛使用,而AOP(面向切面编程)则是Spring框架的一个重要特性。AOP为开发者提供了一种处理横切关注点的新方法,使得代码更加模块化,提高了...

    c3p0-0.9.0 cglib-2.2 cglib-nodep-2.2

    1. **代理实现**:通过继承目标类的方式,CGLIB可以为任何不包含final关键字的类生成代理对象,以实现代理模式,常用于Spring AOP框架中。 2. **方法拦截**:CGLIB通过ASM库(字节码操作库)生成新的类,这些类可以...

    AOP-CGLIB学习-实现简单的注解权限系统

    标题中的"AOP-CGLIB学习-实现简单的注解权限系统"指的是使用Spring的面向切面编程(AOP)特性,结合CGLIB库来创建一个基于注解的权限控制系统。在这个系统中,通过CGLIB动态代理技术,可以对带有特定注解的方法进行...

    spring-cglib-repack-3.2.6.jar和spring-objenesis-repack-2.6.jar

    当目标对象不支持接口时(即,它只是一个普通的Java类),Spring会利用CGlib创建目标对象的子类,并在子类中拦截方法调用,这样就能实现AOP(面向切面编程)的功能。例如,Spring的事务管理、缓存管理和性能监控等...

    深入字节码 -- 使用 ASM 实现 AOP1

    与 Spring、AspectJ 和 CGLib 等 AOP 框架相比,ASM 更底层,灵活性更高,但学习曲线更陡峭。Spring 和 AspectJ 提供了更高级别的抽象,使得开发者可以通过更直观的方式定义切面,而不需要直接操作字节码。 总的来...

    强势推送cglib-full-2.0及cglib-full-2.0.2

    - **AOP(面向切面编程)**:Spring AOP框架就利用CGLib实现对非接口类的代理,通过在目标方法前后插入增强代码,实现切面功能。 - **ORM(对象关系映射)**:Hibernate等ORM框架在无法使用JDK动态代理(即目标类...

    spring-cglib-repack-3.2.5.jar和spring-objenesis-repack-2.6.jar

    在Spring框架中,CGLIB主要被用于AOP(面向切面编程)的实现。当Spring需要对某个目标对象进行代理,但该对象不支持接口时,就会使用CGLIB。CGLIB通过字节码生成技术,为原始类创建一个子类,并在子类中拦截方法调用...

    spring-cglib-repack-3.2.5.jar,spring-objenesis-repack-2.6.jar

    在Spring中,当一个类没有实现接口时,Spring会使用CGLIB来创建代理对象,以便在不修改原有代码的情况下,为对象添加额外的功能,如事务管理、性能监控等。CGLIB的repack版本是对原始CGLIB库的重新打包,目的是为了...

    CGLIB需要的asm-2.2.3.jar和cglib-nodep-2.2.jar

    2. **AOP(面向切面编程)**:CGLIB常被用于实现AOP框架,例如Spring AOP。在Spring中,如果没有使用接口,那么默认会使用CGLIB来创建代理,以便在方法调用前后插入切面逻辑。 3. **性能优化**:由于CGLIB是基于...

    spring-cglib-repack-3.2.6.jar,spring-objenesis-repack-2.6.jarspring-cglib-repack

    `spring-cglib-repack-3.2.6.jar` 包含了CGLIB库的重新打包版本,可能包含了针对Spring框架优化的特定实现,确保与Spring的其他组件无缝集成。 其次,`Objenesis` 是一个Java库,用于在没有默认构造函数的情况下...

    spring-cglib-repack-3.1.jar,spring-objenesis-repack-2.1.jar

    当Spring需要为目标对象创建代理以便实现方法拦截时,如果目标类没有实现接口,CGLIB就会派上用场,生成一个该类的子类,然后在子类中插入拦截逻辑。这样,我们可以在不修改原有代码的情况下,通过AOP来增强或监控...

    spring导入eclipse时少的spring-cglib-repack-3.2.4.jar和spring-objenesis-repack-2.4.jar

    在Spring框架中,CGlib被用来实现AOP(面向切面编程)中的代理机制。当目标对象不支持接口(即为final类或者没有接口的类)时,Spring会使用CGlib来创建代理对象。通过这种方式,Spring能够注入切面逻辑,比如日志...

    开源框架spring详解-----AOP的深刻理解

    AspectJ是一种更强大的AOP实现,它不仅支持Spring的注解驱动的AOP,还可以进行编译时织入和加载时织入,提供了更灵活的切点表达式,可以精确地指定何时何地应用切面。Spring可以通过AspectJ的编译工具或 weaving ...

    jar包---Spring Aop AspectJ新增包.rar

    基于代理的AOP是Spring默认的方式,它主要通过JDK动态代理或者CGLIB字节码生成技术来创建代理对象,实现代理逻辑。这种方式简单易用,但仅限于处理接口。而AspectJ则是更为强大的AOP解决方案,它可以处理非接口类,...

Global site tag (gtag.js) - Google Analytics