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是一个重要的动态代理库,它用于在运行时创建子类以实现对目标对象的代理。CGLIB是针对那些不支持接口代理(例如Java中的final类)的情况而设计的。下面我们将深入探讨Spring ...
CGLIB(Code Generation Library)是一个代码生成库,它可以在运行时动态生成Java类的子类,从而实现方法拦截。CGLIB通常用于为没有实现接口的类创建代理,它利用ASM库来处理字节码生成。ASM是一个底层的Java字节码...
CGLIB(Code Generation Library)是一个强大的高性能的代码生成库,它在许多AOP框架中被用于动态创建子类以实现方法拦截。当目标对象没有实现任何接口时,Spring会使用CGLIB来创建代理。CGLIB通过生成目标类的子类...
在 Spring AOP 框架中,默认情况下,Spring 会选择使用 JDK 动态代理,但是如果目标对象没有实现接口,Spring 就会选择使用 CGLIB 动态代理。这种机制可以确保 Spring AOP 框架可以代理任何类型的对象,无论它是否...
Spring框架是AOP实现的一个典范,它提供了两种主要的动态代理方式:JDK动态代理和CGLib动态代理。 **JDK动态代理**: JDK动态代理基于Java的反射API实现,适用于接口代理。当目标对象实现了至少一个接口时,Spring...
Spring AOP可以利用JDK动态代理来实现对方法的拦截,当调用目标对象的方法时,实际上执行的是代理对象的方法,从而实现在方法执行前后加入额外逻辑。 以下是使用JDK动态代理实现Spring AOP的步骤: 1. **定义切面...
JDK和CGlib是两种常用的动态代理实现方式,它们各自有不同的特性和使用场景。 首先,我们来详细了解一下JDK动态代理。JDK动态代理基于接口实现,它要求被代理的对象必须实现至少一个接口。通过`java.lang.reflect....
CGLIB使用ASM库来生成和转换字节码,其核心类是`net.sf.cglib.proxy.Enhancer`,我们可以设置Enhancer的callback来实现方法拦截。 **Javassist**: Javassist是一个开源的分析、操作和转换Java字节码的库。相比于...
Spring AOP 中 JDK 和 CGLib 动态代理哪个更快?
JDK和CGLIB是Java中实现动态代理的两种主要方式,它们在Spring框架中扮演着关键角色,尤其是在AOP(面向切面编程)中。 1. **JDK动态代理**: JDK动态代理基于Java的接口机制实现,因此,要使用JDK动态代理,被...
在Spring中,AOP主要通过两种方式实现:一种是基于代理(Proxy-based),可以使用JDK动态代理或CGLIB;另一种是基于AspectJ的编译时和加载时织入。这里的"aop(cglib)"表明这个资源包可能包含使用CGLIB库创建代理对象...
在"通过Configuration文件实现AOP.docx"文档中,可能会详细讲述如何在Spring配置文件中配置AOP代理,包括如何选择使用JDK动态代理还是CGLIB。 总结来说,JDK动态代理简单且高效,适合接口驱动的设计,而CGLIB适用于...
Cglib代理是Spring AOP在无法使用JDK动态代理(例如代理的目标对象没有实现接口)时的另一种选择。Cglib是一个强大的、高性能的代码生成库,它基于ASM库来动态生成子类,从而实现对方法的拦截。当目标类是不可变的...
1. **原理**:CGLIB通过ASM库在运行时动态生成一个目标类的子类,从而实现对目标对象的方法拦截。这个子类重写了目标类的所有非final方法,并在这些方法内部调用拦截器链。 2. **过程**:CGLIB使用`Enhancer`类作为...
以下是使用CGlib实现动态代理的关键步骤: 1. 引入依赖:在项目中,需要引入CGlib的相关库,通常是在Maven或Gradle的配置文件中添加对应的依赖。 2. 创建Enhancer对象:Enhancer是CGlib的核心类,它提供了创建代理...
Spring AOP则是在Spring框架中对AOP概念的实现,它利用了JDK动态代理或CGLIB(字节码增强)来实现。Spring AOP的主要目标是分离关注点,将非业务逻辑(如日志、事务管理)从核心业务代码中解耦出来。以下是Spring ...
Cglib就是一种实现动态代理的方式,不同于JDK自带的Proxy,Cglib不需要目标对象实现任何接口,因此可以用于不能实现接口的对象。通过Enhancer类,我们可以指定需要代理的目标类,并提供回调方法实现动态代理逻辑。 ...
JDK和CGLIB是两种常用的实现Java动态代理的方式。本文将深入探讨这两个库以及它们的工作原理。 **JDK动态代理** JDK动态代理基于Java反射API实现,它提供了`java.lang.reflect.Proxy`类和`java.lang.reflect....
总结来说,Spring AOP通过JDK的动态代理机制,为实现了接口的目标对象创建代理,使得我们能够在不修改原始代码的情况下,方便地添加额外的功能,如日志、事务控制等。这种方法尤其适合于那些已经定义了清晰接口的...
动态代理主要分为两种实现方式:JDK动态代理和CGLIB动态代理。 1. JDK动态代理: JDK动态代理基于Java的反射API,它要求被代理的目标对象必须实现一个或多个接口。JDK动态代理的核心类是`java.lang.reflect.Proxy`...