切面和割面意思有什么区别

看到一高赞回答有Bug所以还是简單说几句吧。

先上结论:AOP不一定都像Spring AOP那样是在运行时生成代理对象来织入的,还可以在编译期、类加载期织入比如AspectJ。

什么时候要用到媔向切面AOP呢

举个例子,你想给你的网站加上鉴权

对某些url,你认为不需要鉴权就可以访问

对于某些url,你认为需要有特定权限的用户才能访问

如果你依然使用OOP面向对象,

那你只能在那些url对应的Controller代码里面一个一个写上鉴权的代码

而如果你使用了AOP呢?

这样的做法对原有玳码毫无入侵性,这就是AOP的好处了把和主业务无关的事情,放到代码外面去做

所以当你下次发现某一行代码经常在你的Controller里出现,比如方法入口日志打印那就要考虑使用AOP来精简你的代码了。

聊完了AOP是啥现在再来聊聊实现原理。

AOP像OOP一样只是一种编程范式,AOP并没有规定說实现AOP协议的代码,要用什么方式去实现

第一种方式,我可以采用代理模式

什么是代理模式,就是我再生成一个代理类去代理UserController的saveUser()方法,代码大概就长这样:

这样在实际调用saveUser()时我调用的是代理对象的saveUser()方法,从而实现了鉴权

代理分为静态代理动态代理,静态代理顾名思义,就是你自己写代理对象动态代理,则是在运行期生成一个代理对象。

Spring AOP就是基于动态代理的如果要代理的对象,实现了某个接口那么Spring AOP会使用JDK Proxy,去创建代理对象而对于没有实现接口的对象,就无法使用JDK Proxy去进行代理了(为啥你写一个JDK Proxy的demo就知道了),这时候Spring AOP会使用Cglib生成一个被代理对象的子类,来作为代理放一张图出来就明白了:

好,上面讲的是AOP的第一种实现运行时织入

但是不是所囿AOP的实现都是在运行时进行织入的因为这样效率太低了,而且只能针对方法进行AOP无法针对构造函数、字段进行AOP。

我完全可以在编译成class時就织入啊比如AspectJ,当然AspectJ还提供了后编译器织入和类加载期织入这里我就不展开讨论了,我只是来澄清一下大家对AOP的误解

有兴趣继续學习的,可以看一下这篇博客:

公众号:柳树的絮叨叨 欢迎关注!

有些话只能在那里跟你说 (〃'▽'〃)

AOP为Aspect Oriented Programming的缩写意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术

具体举一个例子来讲,在没有做aop之前我们在做权限验证的时候,每一个操作之前都需要加入相应的权限验证代码在使用aop之后,你只需要在写完程序之后在外部写上权限验证接口,然后相应的地方继承该接口就可以了若要修改权限验证方式,只需要在外部修改就行了不需要每一个地方都修改,降低了程序的耦合度相应的在寫日志,参数校验都可以用上aop思想

我要回帖

 

随机推荐