`

aop jdk cglib方法实现

 
阅读更多

aop实现方式有两种,一种是jdk用接口实现,一种是cglib生成子类实现

 

jdk方式

这种方式必须是针对接口编程,下面给出示例代码

 

业务接口类

public interface UserService {

public void saveString(User user, String str);

}

业务实现类

public class UserServiceImpl implements UserService {

 

@Override

public void saveString(User user, String str) {

System.out.println("保存str:" + str);

}

 

}

 

生成代理类工厂

public class ProxyFactory implements InvocationHandler {

 

private Object targectObject;

 

public Object createProxyInstance(Object obj) {

this.targectObject = obj;

return Proxy.newProxyInstance(this.targectObject.getClass().getClassLoader(), this.targectObject.getClass().getInterfaces(), this);

 

}

 

@Override

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

UserService userService = (UserService) this.targectObject;

return method.invoke(userService, args);

}

 

}

 

这个代理工厂可以不实现jdk中的InvocationHandler,这个handler是在Proxy.newProxyInstance的时候,需要有个处理,这里直接放这个工厂里面,是共用了targectObject这个对象,一般写法,是要独立出来。

 

测试代码

public static void main(String[] args) {

ProxyFactory pf = new ProxyFactory();

UserService userService = new UserServiceImpl();

UserService service = (UserService) pf.createProxyInstance(userService);

service.saveString(new User(), "123");

 

}

 

 

 

cglib方式

该方式是针对类编程的,可以无接口

只给出代理工厂的代码,业务代码同上

public class CglibProxyFactory implements MethodInterceptor {

 

private Object targetObject;

 

public Object createIntance(Object obj) {

this.targetObject = obj;

Enhancer enhancer = new Enhancer();

enhancer.setSuperclass(this.targetObject.getClass());

enhancer.setCallback(this);

return enhancer.create();

}

 

@Override

public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {

UserService userService = (UserService) this.targetObject;

return method.invoke(userService, args);

}

 

}

同上,该工厂同样实现了cglib的MethodInterceptor ,该接口中的方法是为了enhancer.setCallback使用,一般也独立出来,这里方便处理就放一起了

 

测试代码

public static void main(String[] args) {

CglibProxyFactory cpf = new CglibProxyFactory();

UserService userService = new UserServiceImpl();

UserService service = (UserService) cpf.createIntance(userService);

service.saveString(new User(), "123");

 

}

 

 

 

 

 

分享到:
评论

相关推荐

    spring_aop_cglib的实现方式

    在Spring AOP(面向切面编程)中,CGLIB是一个重要的动态代理库,它用于在运行时创建子类以实现对目标对象的代理。CGLIB是针对那些不支持接口代理(例如Java中的final类)的情况而设计的。下面我们将深入探讨Spring ...

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

    CGLIB(Code Generation Library)是一个代码生成库,它可以在运行时动态生成Java类的子类,从而实现方法拦截。CGLIB通常用于为没有实现接口的类创建代理,它利用ASM库来处理字节码生成。ASM是一个底层的Java字节码...

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

    CGLIB(Code Generation Library)是一个强大的高性能的代码生成库,它在许多AOP框架中被用于动态创建子类以实现方法拦截。当目标对象没有实现任何接口时,Spring会使用CGLIB来创建代理。CGLIB通过生成目标类的子类...

    Spring框架中JDK动态代理和cglib动态代理

    在 Spring AOP 框架中,默认情况下,Spring 会选择使用 JDK 动态代理,但是如果目标对象没有实现接口,Spring 就会选择使用 CGLIB 动态代理。这种机制可以确保 Spring AOP 框架可以代理任何类型的对象,无论它是否...

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

    Spring框架是AOP实现的一个典范,它提供了两种主要的动态代理方式:JDK动态代理和CGLib动态代理。 **JDK动态代理**: JDK动态代理基于Java的反射API实现,适用于接口代理。当目标对象实现了至少一个接口时,Spring...

    Spring-AOP-JDK动态代理

    Spring AOP可以利用JDK动态代理来实现对方法的拦截,当调用目标对象的方法时,实际上执行的是代理对象的方法,从而实现在方法执行前后加入额外逻辑。 以下是使用JDK动态代理实现Spring AOP的步骤: 1. **定义切面...

    JDK和CGlib分别实现的动态代理源代码

    JDK和CGlib是两种常用的动态代理实现方式,它们各自有不同的特性和使用场景。 首先,我们来详细了解一下JDK动态代理。JDK动态代理基于接口实现,它要求被代理的对象必须实现至少一个接口。通过`java.lang.reflect....

    Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

    CGLIB使用ASM库来生成和转换字节码,其核心类是`net.sf.cglib.proxy.Enhancer`,我们可以设置Enhancer的callback来实现方法拦截。 **Javassist**: Javassist是一个开源的分析、操作和转换Java字节码的库。相比于...

    Spring AOP 中 JDK 和 CGLib 动态代理哪个更快?.docx

    Spring AOP 中 JDK 和 CGLib 动态代理哪个更快?

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

    JDK和CGLIB是Java中实现动态代理的两种主要方式,它们在Spring框架中扮演着关键角色,尤其是在AOP(面向切面编程)中。 1. **JDK动态代理**: JDK动态代理基于Java的接口机制实现,因此,要使用JDK动态代理,被...

    SpringMVC精品资源--手写Spring,支持ioc(三级缓存)、aop(cglib)、内嵌tomcat.zip

    在Spring中,AOP主要通过两种方式实现:一种是基于代理(Proxy-based),可以使用JDK动态代理或CGLIB;另一种是基于AspectJ的编译时和加载时织入。这里的"aop(cglib)"表明这个资源包可能包含使用CGLIB库创建代理对象...

    浅谈JDK动态代理与CGLIB代理去区别

    在"通过Configuration文件实现AOP.docx"文档中,可能会详细讲述如何在Spring配置文件中配置AOP代理,包括如何选择使用JDK动态代理还是CGLIB。 总结来说,JDK动态代理简单且高效,适合接口驱动的设计,而CGLIB适用于...

    Spring框架系列(11) - Spring AOP实现原理详解之Cglib代理实现.doc

    Cglib代理是Spring AOP在无法使用JDK动态代理(例如代理的目标对象没有实现接口)时的另一种选择。Cglib是一个强大的、高性能的代码生成库,它基于ASM库来动态生成子类,从而实现对方法的拦截。当目标类是不可变的...

    jdk与cglib动态度代理的区别原理

    1. **原理**:CGLIB通过ASM库在运行时动态生成一个目标类的子类,从而实现对目标对象的方法拦截。这个子类重写了目标类的所有非final方法,并在这些方法内部调用拦截器链。 2. **过程**:CGLIB使用`Enhancer`类作为...

    CGlib实现动态代理(承接上面JDK实现动态代理)

    以下是使用CGlib实现动态代理的关键步骤: 1. 引入依赖:在项目中,需要引入CGlib的相关库,通常是在Maven或Gradle的配置文件中添加对应的依赖。 2. 创建Enhancer对象:Enhancer是CGlib的核心类,它提供了创建代理...

    JDK动态代理 spring aop 的原理

    Spring AOP则是在Spring框架中对AOP概念的实现,它利用了JDK动态代理或CGLIB(字节码增强)来实现。Spring AOP的主要目标是分离关注点,将非业务逻辑(如日志、事务管理)从核心业务代码中解耦出来。以下是Spring ...

    Cglib3.3.0最新版jar包

    Cglib就是一种实现动态代理的方式,不同于JDK自带的Proxy,Cglib不需要目标对象实现任何接口,因此可以用于不能实现接口的对象。通过Enhancer类,我们可以指定需要代理的目标类,并提供回调方法实现动态代理逻辑。 ...

    jdk动态代理 cglib3.0动态代理

    JDK和CGLIB是两种常用的实现Java动态代理的方式。本文将深入探讨这两个库以及它们的工作原理。 **JDK动态代理** JDK动态代理基于Java反射API实现,它提供了`java.lang.reflect.Proxy`类和`java.lang.reflect....

    spring_aop之JDK的动态代理

    总结来说,Spring AOP通过JDK的动态代理机制,为实现了接口的目标对象创建代理,使得我们能够在不修改原始代码的情况下,方便地添加额外的功能,如日志、事务控制等。这种方法尤其适合于那些已经定义了清晰接口的...

    java动态代理(JDK和cglib).pdf

    动态代理主要分为两种实现方式:JDK动态代理和CGLIB动态代理。 1. JDK动态代理: JDK动态代理基于Java的反射API,它要求被代理的目标对象必须实现一个或多个接口。JDK动态代理的核心类是`java.lang.reflect.Proxy`...

Global site tag (gtag.js) - Google Analytics