Spring-AOP原理

JDK的动态代理

public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)

三个参数

ClassLoader:用于加载代理类的Loader类

Interfaces:被代理的接口

InvocationHandler:用于执行被代理接口中方法之外的用户自定义的操作,用户代理的最终目的。目标方法都被代理到类中唯一方法invoke()中。

Proxy产生代理类的过程

1.调用Proxy的newProxyInstance方法
2.调用自己的getProxyClass方法
3.构造代理类名
4.调用其generateProxyClass方法
5.调用本地方法defineClass0构造代理类
6.根据代理类创建代理对象
 

Spring AOP如何实现代理

代理的目的是调用目标方法时转而执行InvocationHandler类的invoke方法。

创建代理对象后,调用目标方法时,都会被代理到InvocationHandler类的invoke方法中执行,JdkDynamicAopProxy类实现了InvocationHandler接口。代理对象通过InvocationHandler持有对目标对象的引用。

设计模式的应用

代理模式

 静态代理和动态代理的区别

静态代理类:在程序运行前,代理类的.class文件就已经存在了,已确定被代理的对象

优点:对真实对象进行封装,不会修改目标类的代码。

缺点

1.多个不同类型目标对象需要代理时,我就需要建立多个代理类,造成类的膨胀
2.代码的冗余
3.编译期加入,不够灵活

动态代理

不显式的实现与真实主题类相同的接口,把这种实现推迟到运行时。为达到这一目的,需要让动态代理类实现JDK自带的InvocationHandler接口。所以必须先把真实对象类已实现的所有接口都加载到JVM中,这样JVM在运行时就可以找到这些方法。然后就可以创建一个被代理类的实例,获得该实例的类加载器。

优点:

1、一个动态代理类更加简单了,可以解决创建多个静态代理的麻烦,避免不断的重复多余的代码

2、调用目标代码时,会在方法“运行时”动态的加入,决定你是什么类型,才调谁,灵活

缺点:

1、系统灵活了,但是相比而言,效率降低了,比静态代理慢一点

2、动态代理比静态代理在代码的可读性上差了一点,不太容易理解

3、JDK动态代理只能对实现了接口的类进行代理

策略模式

ConcreteStrategy:具体策略实现类,实现在抽象策略中定义的策略方法。

这里抽象策略是 AopProxy 接口,Cglib2AopProxy 和 JdkDynamicAopProxy 分别代表两种策略的实现方式,ProxyFactoryBean代表Context角色,它根据条件选择使用 JDK 代理方式还是CGLIB方式。 而另外三个类主要负责创建具体的策略对象, ProxyFactoryBean 是通过依赖的方法来关联具体策略对象的,它通过调用策略对象的 getProxy(ClassLoader classLoader)方法来完成操作。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值