Spring框架系列之AOP思想
微信公眾號(hào):compassblog
歡迎關(guān)注、轉(zhuǎn)發(fā),互相學(xué)習(xí),共同進(jìn)步!
有任何問(wèn)題,請(qǐng)后臺(tái)留言聯(lián)系!
1、AOP概述
(1)、什么是 AOP
AOP 為 Aspect Oriented Programming 的縮寫(xiě),意為“面向切面編程”。AOP 是 OOP (面向?qū)ο?#xff09;的延續(xù),可以對(duì)業(yè)務(wù)的各個(gè)部分進(jìn)行隔離,從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低,提高程序的可重用性和開(kāi)發(fā)效率。
(2)、AOP 思想圖解:橫向重復(fù),縱向切取
-
過(guò)濾器
-
攔截器
-
事務(wù)管理
(3)、AOP 可以實(shí)現(xiàn)的功能
-
權(quán)限驗(yàn)證
-
日志記錄
-
性能控制
-
事務(wù)控制
(4)、AOP 底層實(shí)現(xiàn)的兩種代理機(jī)制
-
JDK的動(dòng)態(tài)代理 :針對(duì)實(shí)現(xiàn)了接口的類(lèi)產(chǎn)生代理
?
-
Cglib的動(dòng)態(tài)代理 :針對(duì)沒(méi)有實(shí)現(xiàn)接口的類(lèi)產(chǎn)生代理,應(yīng)用的是底層的字節(jié)碼增強(qiáng)的技術(shù)生成當(dāng)前類(lèi)的子類(lèi)對(duì)象
2、Spring底層AOP實(shí)現(xiàn)原理
(1)、 JDK 動(dòng)態(tài)代理增強(qiáng)一個(gè)類(lèi)中方法:被代理對(duì)象必須要實(shí)現(xiàn)接口,才能產(chǎn)生代理對(duì)象。如果沒(méi)有接口將不能使用動(dòng)態(tài)代理技術(shù)。
public class MyJDKProxy implements InvocationHandler {
? ? private UserDao userDao;
? ? public MyJDKProxy(UserDao userDao) { ?
? ? ? ? this.userDao = userDao;
? ? }
? ?public UserDao createProxy(){
? ? ? ?UserDao ?userDaoProxy ?= ?(UserDao)Proxy.newProxyInstance(userDao.getClass().getClassLoader(),userDao.getClass().getInterfaces(), this);
? ? ? ?return userDaoProxy;
? ?}
? ?@Override
? ?public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
? ?{
? ? ? ?if("save".equals(method.getName())){
? ? ? ? ? ?System.out.println("權(quán)限校驗(yàn)=============
? ? ? ?}
? ? ? ?return method.invoke(userDao, args);
? ?}
}
(2)、Cglib ?動(dòng)態(tài)代理增強(qiáng)一個(gè)類(lèi)中的方法:可以對(duì)任何類(lèi)生成代理,代理的原理是對(duì)目標(biāo)對(duì)象進(jìn)行繼承代理。如果目標(biāo)對(duì)象被final修飾,那么該類(lèi)無(wú)法被cglib代理。
public class MyCglibProxy implements MethodInterceptor{
? ?private CustomerDao customerDao;
? ?public MyCglibProxy(CustomerDao customerDao){ ?
? ? ? ?this.customerDao = customerDao;
}
? ? ?// 生成代理的方法:
? ?public CustomerDao createProxy(){
? ? ?// 創(chuàng)建Cglib的核心類(lèi):
? ?Enhancer enhancer = new Enhancer();
? ? ?// 設(shè)置父類(lèi):
? ? ?enhancer.setSuperclass(CustomerDao.class);
? ? ?// 設(shè)置回調(diào):
? ? ?enhancer.setCallback(this);
? ? ?// 生成代理:
? ? ?CustomerDao customerDaoProxy = (CustomerDao) enhancer.create(); ?
? ? ?return customerDaoProxy;
}
? ?@Override
? ?public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
? ?if("delete".equals(method.getName())){
? ? ? ?Object obj = methodProxy.invokeSuper(proxy, args);
? ? ? ?System.out.println("日志記錄================");
? ? ? ?return obj;
? ? ? ?}
? ? ? ?return methodProxy.invokeSuper(proxy, args);
? ?}
}
3、Spring 基于 AspectJ AOP 開(kāi)發(fā)的相關(guān)術(shù)語(yǔ)
-
Joinpoint(連接點(diǎn)):所謂連接點(diǎn)是指那些被攔截到的點(diǎn)。在 spring 中,這些點(diǎn)指的是方法,因?yàn)?spring 只支持方法類(lèi)型的連接點(diǎn)
-
Pointcut(切入點(diǎn)):所謂切入點(diǎn)是指我們要對(duì)哪些 Joinpoint 進(jìn)行攔截的定義
-
Advice(通知/增強(qiáng)):所謂通知是指攔截到 Joinpoint 之后所要做的事情就是通知,通知分為前置通知,后置通知,異常通知,最終通知,環(huán)繞通知(切面要完成的功能)
-
Introduction(引介):引介是一種特殊的通知,在不修改類(lèi)代碼的前提下, Introduction 可以在運(yùn)行期為類(lèi)動(dòng)態(tài)地添加一些方法或 Field
-
Target(目標(biāo)對(duì)象):代理的目標(biāo)對(duì)象
-
Weaving(織入):是指把增強(qiáng)應(yīng)用到目標(biāo)對(duì)象來(lái)創(chuàng)建新的代理對(duì)象的過(guò)程。spring 采用動(dòng)態(tài)代理織入,而 AspectJ 采用編譯期織入和類(lèi)裝在期織入
-
Proxy(代理):一個(gè)類(lèi)被 AOP 織入增強(qiáng)后,就產(chǎn)生一個(gè)結(jié)果代理類(lèi)
-
Aspect(切面):是切入點(diǎn)和通知(引介)的結(jié)合
您可能還喜歡:
-
Spring框架系列(二)之Bean的注解管理
-
【SSH框架】之Spring系列(一)
-
【SSH框架】之Hibernate系列(一)
-
講講本人本專(zhuān)業(yè)找工作的那些事兒
-
前端系列之JavaScript基礎(chǔ)知識(shí)概述
?
本系列后期仍會(huì)持續(xù)更新,歡迎關(guān)注!
?
如果你認(rèn)為這篇文章有用,歡迎轉(zhuǎn)發(fā)分享給你的好友!
本號(hào)文章可以任意轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明出處!
?
掃碼關(guān)注微信公眾號(hào),了解更多
轉(zhuǎn)載于:https://www.cnblogs.com/compassblog/p/8486478.html
總結(jié)
以上是生活随笔為你收集整理的Spring框架系列之AOP思想的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Mininet的介绍安装
- 下一篇: 《JavaEE开发的颠覆者——Sprin