一、代理的概念
-
拦截器(Interceptors):Spring AOP允许开发者定义拦截器,这些拦截器可以在方法执行前后或抛出异常时执行特定的逻辑。例如,可以在服务层方法调用前后自动执行日志记录,而无需在每个方法中显式编写日志代码。 -
适配器(Adapters):虽然传统意义上的适配器模式并不直接由Spring AOP提供,但AOP的思想可以用于构建灵活的、可重用的适配器组件,特别是当这些适配器需要处理跨多个组件的横切关注点时。AOP使得适配器能够专注于其核心职责,同时允许其他关注点(如安全、日志等)通过切面(Aspect)来透明地添加。 -
统一结果返回:利用AOP,可以定义一个切面来统一处理服务层或控制器层方法的返回值。这个切面可以在方法执行完毕后,根据业务需求对返回值进行统一处理,如封装成统一格式的响应体返回给客户端。 -
统一异常处理:Spring AOP使得开发者能够定义一个全局的异常处理切面,该切面能够捕获并处理来自应用程序中多个部分的异常。这种方式避免了在每个方法中重复编写异常处理代码,提高了代码的整洁性和可维护性。 -
统一通知处理:AOP中的“通知”(Advice)是切面中的一个关键部分,它定义了切面的具体行为。通过定义不同类型的通知(如前置通知、后置通知、环绕通知等),开发者可以实现对方法调用的精确控制,并在方法调用的不同阶段执行统一的逻辑。
二、什么是代理模式?
举个例子:例如一些朋友可能通过在一些线上平台租房子,那么这个平台就是我们和房子之间的纽带。平台能够帮我们寻找要出租的房子,并对房子进行出租价格的评定。这就是代理模式。
代理可分为静态代理和动态代理:
动态代理(主要是通过反射来完成的代理模式)
三、静态代理
由程序员创建代理类或特定⼯具⾃动⽣成源代码再对其编译,在程序运⾏前代理类的.class⽂件就已经存在了
public class HouseProxy implements HouseSubject{
//将被代理对象声明为成员变量
private HouseSubject houseSubject;
public HouseProxy(HouseSubject houseSubject) {
this.houseSubject = houseSubject;
}
@Override
public void rentHouse() {
//开始代理
System.out.println("我是中介, 开始代理");
//代理房东出租房⼦
houseSubject.rentHouse();
//代理结束
System.out.println("我是中介, 代理结束");
}
}
四、JDK代理
// 定义一个接口
interface Subject {
void request();
}
// 被代理的类
class RealSubject implements Subject {
@Override
public void request() {
System.out.println("Called RealSubject.request()");
}
}
// 实现InvocationHandler接口来定义代理的行为
class MyInvocationHandler implements InvocationHandler {
private Object target; // 被代理的对象
public MyInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 在目标方法执行之前可以添加自定义操作
System.out.println("Before method: " + method.getName());
// 调用目标方法
Object result = method.invoke(target, args);
// 在目标方法执行之后可以添加自定义操作
System.out.println("After method: " + method.getName());
return result;
}
}
public class ProxyDemo {
public static void main(String[] args) {
// 创建被代理的对象
Subject realSubject = new RealSubject();
// 创建InvocationHandler对象,并将被代理的对象传递给它的构造器
InvocationHandler handler = new MyInvocationHandler(realSubject);
// 通过Proxy类为RealSubject类动态创建一个代理对象
// 第一个参数是类加载器,第二个参数是被代理对象实现的接口列表,第三个参数是InvocationHandler对象
Subject proxySubject = (Subject) Proxy.newProxyInstance(
RealSubject.class.getClassLoader(),
new Class[] { Subject.class },
handler
);
// 通过代理对象调用方法
proxySubject.request();
}
}
原文始发于微信公众号(Java技术前沿):SpringBoot实战:Spring AOP动态代理和静态代理
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/299690.html