JDK动态代理和cglib动态代理
动态代理是一种在运行时创建代理对象的机制,它可以在不修改源代码的情况下,对方法进行增强或拦截。在Java中,有两种常见的实现动态代理的方式:JDK动态代理和CGLIB动态代理。
JDK动态代理
JDK动态代理是Java提供的一种基于接口的代理方式。它要求被代理的类必须实现一个接口,并且通过Java原生的java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来创建代理对象。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public interface HelloService {
void sayHello();
}
public class HelloServiceImpl implements HelloService {
@Override
public void sayHello() {
System.out.println("Hello!");
}
}
public class HelloServiceProxy implements InvocationHandler {
private Object target;
public Object bind(Object target) {
this.target = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 在方法执行前进行增强
System.out.println("Before invoking sayHello()");
Object result = method.invoke(target, args);
// 在方法执行后进行增强
System.out.println("After invoking sayHello()");
return result;
}
}
public class Main {
public static void main(String[] args) {
HelloService helloService = new HelloServiceImpl();
HelloServiceProxy proxy = new HelloServiceProxy();
HelloService helloServiceProxy = (HelloService) proxy.bind(helloService);
helloServiceProxy.sayHello();
}
}
Before invoking sayHello()
Hello!
After invoking sayHello()
CGLIB动态代理
CGLIB动态代理是基于继承的代理方式,它通过创建目标类的子类来实现代理。相比JDK动态代理,CGLIB动态代理不要求被代理的类实现接口,但需要依赖第三方库CGLIB。
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class HelloService {
public void sayHello() {
System.out.println("Hello!");
}
}
public class HelloServiceInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
// 在方法执行前进行增强
System.out.println("Before invoking sayHello()");
Object result = proxy.invokeSuper(obj, args);
// 在方法执行后进行增强
System.out.println("After invoking sayHello()");
return result;
}
}
public class Main {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(HelloService.class);
enhancer.setCallback(new HelloServiceInterceptor());
HelloService helloService = (HelloService) enhancer.create();
helloService.sayHello();
}
}
Before invoking sayHello()
Hello!
After invoking sayHello()
spring中使用jdk动态代理
public interface HelloService {
void sayHello();
}
public class HelloServiceImpl implements HelloService {
@Override
public void sayHello() {
System.out.println("Hello!");
}
}
创建bean
@Configuration
public class AppConfig {
@Bean
public HelloService helloService() {
return new HelloServiceImpl();
}
}
注入:
@Service
public class HelloServiceConsumer {
@Autowired
private HelloService helloService;
public void invokeHelloService() {
helloService.sayHello();
}
}
基于cglib
public class HelloService {
public void sayHello() {
System.out.println("Hello!");
}
}
@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class AppConfig {
@Bean
public HelloService helloService() {
return new HelloService();
}
}
使用:
@Service
public class HelloServiceConsumer {
@Autowired
private HelloService helloService;
public void invokeHelloService() {
helloService.sayHello();
}
}