spring中,aop通过cglib的实现方式和例子
时间: 2023-08-15 09:33:48 浏览: 104
在Spring中,如果要代理没有实现接口的类,可以使用cglib来实现动态代理。下面是cglib实现动态代理的方式和例子。
首先,引入cglib的依赖:
```xml
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
```
然后,定义一个需要被代理的类RealSubject,其中不需要实现任何接口:
```java
public class RealSubject {
public void request() {
System.out.println("RealSubject Request");
}
}
```
接下来,定义一个MethodInterceptor接口的实现类ProxyHandler,其中定义一个RealSubject类型的成员变量,用于指定代理的目标对象,然后在intercept方法中实现对目标对象方法的代理:
```java
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class ProxyHandler implements MethodInterceptor {
private RealSubject realSubject;
public ProxyHandler(RealSubject realSubject) {
this.realSubject = realSubject;
}
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("ProxySubject before request");
Object result = method.invoke(realSubject, args);
System.out.println("ProxySubject after request");
return result;
}
}
```
在ProxyHandler类中,我们在intercept方法调用目标对象的方法前后分别输出一些字符串,以此实现对目标对象的代理。
最后,我们可以在客户端代码中创建RealSubject和cglib动态代理对象,并调用request方法:
```java
import net.sf.cglib.proxy.Enhancer;
public class Client {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
ProxyHandler proxyHandler = new ProxyHandler(realSubject);
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(realSubject.getClass());
enhancer.setCallback(proxyHandler);
RealSubject proxySubject = (RealSubject) enhancer.create();
proxySubject.request();
}
}
```
在客户端代码中,我们创建了一个ProxyHandler对象,并将RealSubject对象传入,然后使用Enhancer类动态生成了一个代理对象proxySubject。最后调用proxySubject的request方法,实现了对RealSubject的代理。
输出结果为:
```
ProxySubject before request
RealSubject Request
ProxySubject after request
```
这就是cglib实现动态代理的方式和例子。需要注意的是,cglib动态代理的代理类是目标类的子类,因此如果目标类中有final方法,是无法代理的。
阅读全文