JAVA代理与动态代理

代理模式简介

代理模式:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。

举个例子来说明:假如说我现在想买一辆二手车,虽然我可以自己去找车源,做质量检测等一系列的车辆过户流程,但是这确实太浪费我得时间和精力了。我只是想买一辆车而已为什么我还要额外做这么多事呢?于是我就通过中介公司来买车,他们来给我找车源,帮我办理车辆过户流程,我只是负责选择自己喜欢的车,然后付钱就可以了。用图表示如下:

image

代理模式分类

静态代理

如类图所示,创建服务类接口,实现服务接口,创建代理类

动态代理

java动态代理的实现包括JDK动态代理机制(代理必须有相应的接口),cglib(不需要接口,可以对类进行代理)
在spring中区别如下:

JDK动态代理(Dynamic Proxy)

基于标准JDK的动态代理功能
只针对实现了接口的业务对象

CGLIB

通过动态地对目标对象进行子类化来实现AOP代理
需要指定@EnableAspectJAutoProxy(proxyTargetClass = true)来强制使用
当业务对象没有实现任何接口的时候默认会选择CGLIB

AspectJ
AspectJ是Eclipse旗下的一个项目。Spring AOP借鉴了很多AspectJ成熟的接口和注解等。
很多地方都是直接用到AspectJ里面的代码。典型的比如@Aspect,@Around,@Pointcut注解等等。而且从相关概念以及语法结构上而言,两者其实非常非常相似。比如Pointcut的表达式语法以及Advice的种类,都是一样的。

最大的区别在于两者实现AOP的底层原理不太一样:
Spring AOP: 基于代理(Proxying)
AspectJ: 基于字节码操作(Bytecode Manipulation)

参考:
1.设计模式---代理模式
2.AOP的两种实现-Spring AOP以及AspectJ

你可能感兴趣的:(JAVA代理与动态代理)