0
点赞
收藏
分享

微信扫一扫

MongoDB 数据库分片

WikongGuan 2024-05-10 阅读 6

目录

Spring AOP原理

代理模式

代理模式中的主要角色

静态代理

 动态代理

总结:面试题

什么是AOP?

Spring AOP实现的方式有哪些?

Spring AOP实现原理 

Spring使用的是哪种代理方式?

JDK和CGLIB动态代理的区别?


Spring AOP原理

代理模式

代理模式, 也叫委托模式.

在某些情况下, 一个对象不适合或者不能直接引用另一个对象, 而代理对象可以在客户端和目标对象之间起到中介的作用.

使用代理前:

 

使用代理后:

比如当进行房屋租赁时, 房主会将房屋授权给中介, 由中介来代理看房, 房屋咨询等服务.

代理模式中的主要角色

UML类图如下:

 

代理模式可以在不修改被代理对象的基础上, 通过扩展代理类, 进行一些功能的附加和增强.

根据代理的创建时期, 代理模式分为静态代理和动态代理

静态代理

静态代理: 在程序运行前, 代理类的.class文件就已经存在了. (在出租房子之前, 中介已经做好了相关的工作, 就等租户来租房子了).

以房屋租赁为例编写代码:

1.定义接口(定义房东要做的事情, 也是中介需要做的事情).

public interface HouseSubject {
void rentHouse();
}

2.实现接口(房东出租房子)

public class RealHouseSubject implements HouseSubject{
@Override
public void rentHouse() {
System.out.println("我是房东, 我出租房⼦");
}
}

3.代理(中介, 帮房东出租房子)

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("我是中介, 代理结束");
}
}

4.使用:

public class StaticMain {
public static void main(String[] args) {
HouseSubject subject = new RealHouseSubject();
//创建代理类
HouseProxy proxy = new HouseProxy(subject);
//通过代理类访问⽬标⽅法
proxy.rentHouse();
}
}

运行结果:

 

上面代理的实现方式就是静态代理.

从上述程序中可以看出, 虽然静态代理完成了对目标对象的代理, 但是由于代码都写死了, 对目标对象的每个方法的增强都是手动完成, 非常不灵活.

比如当增加业务时(增加房屋出售), 就还是要编写大量代码.

 动态代理

相比于静态代理来说, 动态代理更加灵活.

我们不需要针对每个目标对象都单独创建一个代理对象, 而是把这个创建代理对象的工作推迟到程序运行时由JVM实现. 也就是说动态代理在程序运行时, 更具需要动态创建生成.

 Java也对动态代理进行了实现, 并给我们提供了一些API, 常见的实现方式有两种:

 一般代理模式开发人员基本用不着,一般是开发框架的人用的, 所以不过多介绍(看了估计也容易忘), 仅给出代码:

//JDK代理
public class JDKInvocationHandler implements InvocationHandler {
private RealHouseSubject target;

public JDKInvocationHandler(RealHouseSubject target) {
this.target = target;
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("开始代理");
Object o = method.invoke(target, args);
System.out.println("结束代理");
return o;
}
}

//main方法
RealHouseSubject subject = new RealHouseSubject();
Subject proxy= (Subject)Proxy.newProxyInstance(subject.getClass().getClassLoader(),
new Class[]{Subject.class},new JDKInvocationHandler(subject));
proxy.rentHouse();

 主要这里注意两个区别:

 

总结:面试题

什么是AOP?

Spring AOP实现的方式有哪些?

Spring AOP实现原理 

Spring使用的是哪种代理方式?

JDK和CGLIB动态代理的区别?

举报

相关推荐

0 条评论