在Java开发中,代理模式是一种常用的设计模式,它可以实现代码的解耦和复用,提高代码的可维护性和扩展性。而Java代理框架则是实现代理模式的一种技术手段。本文将带你入门Java代理框架,重点介绍Spring AOP、CGLIB与动态代理技术。
一、什么是代理模式
代理模式是一种设计模式,它为其他对象提供一种代理以控制对这个对象的访问。代理模式可以在不修改原始对象的情况下,对方法调用进行拦截和处理,从而实现一些额外的功能,如日志记录、事务管理等。
二、Java代理技术
Java提供了两种代理技术:静态代理和动态代理。
1. 静态代理
静态代理通过实现一个接口来创建代理对象,代理对象内部持有目标对象的引用,并重写目标对象的方法,实现额外的功能。
以下是一个静态代理的示例代码:
interface Subject {
void doSomething();
}
class RealSubject implements Subject {
public void doSomething() {
System.out.println("执行真实对象的方法");
}
}
class Proxy implements Subject {
private Subject subject;
public Proxy(Subject subject) {
this.subject = subject;
}
public void doSomething() {
System.out.println("代理开始执行...");
subject.doSomething();
System.out.println("代理结束执行...");
}
}
public class StaticProxyDemo {
public static void main(String[] args) {
Subject subject = new RealSubject();
Subject proxy = new Proxy(subject);
proxy.doSomething();
}
}
2. 动态代理
动态代理通过反射机制动态创建代理对象,代理对象内部持有一个InvocationHandler接口的引用,该接口定义了代理对象的方法。
以下是一个动态代理的示例代码:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface Subject {
void doSomething();
}
class RealSubject implements Subject {
public void doSomething() {
System.out.println("执行真实对象的方法");
}
}
class DynamicProxy implements InvocationHandler {
private Object target;
public DynamicProxy(Object target) {
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理开始执行...");
Object result = method.invoke(target, args);
System.out.println("代理结束执行...");
return result;
}
}
public class DynamicProxyDemo {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
Subject proxy = (Subject) Proxy.newProxyInstance(
Subject.class.getClassLoader(),
new Class<?>[]{Subject.class},
new DynamicProxy(realSubject)
);
proxy.doSomething();
}
}
三、Spring AOP
Spring AOP是基于动态代理技术的一种实现,它允许在运行时动态地为对象添加新的方法或修改已有方法的行为。
以下是一个Spring AOP的示例代码:
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class MyAspect {
@Before("execution(* com.example.service.*.*(..))")
public void beforeAdvice() {
System.out.println("执行前置通知");
}
}
public class MyService {
public void method1() {
System.out.println("执行方法1");
}
}
public class Main {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(MyAspect.class, MyService.class);
MyService service = context.getBean(MyService.class);
service.method1();
}
}
四、CGLIB
CGLIB(Code Generation Library)是一个强大的高性能的代码生成类库,它可以在运行期动态生成字节码,从而实现动态代理。
以下是一个CGLIB代理的示例代码:
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
interface Subject {
void doSomething();
}
class RealSubject implements Subject {
public void doSomething() {
System.out.println("执行真实对象的方法");
}
}
class CglibProxy implements MethodInterceptor {
private Object target;
public CglibProxy(Object target) {
this.target = target;
}
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("代理开始执行...");
Object result = proxy.invoke(target, args);
System.out.println("代理结束执行...");
return result;
}
}
public class CglibProxyDemo {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(RealSubject.class);
enhancer.setCallback(new CglibProxy(realSubject));
Subject proxy = (Subject) enhancer.create();
proxy.doSomething();
}
}
五、总结
本文介绍了Java代理框架的入门知识,包括代理模式、静态代理、动态代理、Spring AOP和CGLIB。通过学习这些技术,你可以更好地理解和应用代理模式,提高代码的可维护性和扩展性。希望本文对你有所帮助!
