Spring框架系列之AOP思想
微信公眾號:compassblog
歡迎關注、轉發,互相學習,共同進步!
有任何問題,請后臺留言聯系!
1、AOP概述
(1)、什么是 AOP
AOP 為 Aspect Oriented Programming 的縮寫,意為“面向切面編程”。AOP 是 OOP (面向對象)的延續,可以對業務的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程序的可重用性和開發效率。
(2)、AOP 思想圖解:橫向重復,縱向切取
-
過濾器
-
攔截器
-
事務管理
(3)、AOP 可以實現的功能
-
權限驗證
-
日志記錄
-
性能控制
-
事務控制
(4)、AOP 底層實現的兩種代理機制
-
JDK的動態代理 :針對實現了接口的類產生代理
?
-
Cglib的動態代理 :針對沒有實現接口的類產生代理,應用的是底層的字節碼增強的技術生成當前類的子類對象
2、Spring底層AOP實現原理
(1)、 JDK 動態代理增強一個類中方法:被代理對象必須要實現接口,才能產生代理對象。如果沒有接口將不能使用動態代理技術。
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("權限校驗=============
? ? ? ?}
? ? ? ?return method.invoke(userDao, args);
? ?}
}
(2)、Cglib ?動態代理增強一個類中的方法:可以對任何類生成代理,代理的原理是對目標對象進行繼承代理。如果目標對象被final修飾,那么該類無法被cglib代理。
public class MyCglibProxy implements MethodInterceptor{
? ?private CustomerDao customerDao;
? ?public MyCglibProxy(CustomerDao customerDao){ ?
? ? ? ?this.customerDao = customerDao;
}
? ? ?// 生成代理的方法:
? ?public CustomerDao createProxy(){
? ? ?// 創建Cglib的核心類:
? ?Enhancer enhancer = new Enhancer();
? ? ?// 設置父類:
? ? ?enhancer.setSuperclass(CustomerDao.class);
? ? ?// 設置回調:
? ? ?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 開發的相關術語
-
Joinpoint(連接點):所謂連接點是指那些被攔截到的點。在 spring 中,這些點指的是方法,因為 spring 只支持方法類型的連接點
-
Pointcut(切入點):所謂切入點是指我們要對哪些 Joinpoint 進行攔截的定義
-
Advice(通知/增強):所謂通知是指攔截到 Joinpoint 之后所要做的事情就是通知,通知分為前置通知,后置通知,異常通知,最終通知,環繞通知(切面要完成的功能)
-
Introduction(引介):引介是一種特殊的通知,在不修改類代碼的前提下, Introduction 可以在運行期為類動態地添加一些方法或 Field
-
Target(目標對象):代理的目標對象
-
Weaving(織入):是指把增強應用到目標對象來創建新的代理對象的過程。spring 采用動態代理織入,而 AspectJ 采用編譯期織入和類裝在期織入
-
Proxy(代理):一個類被 AOP 織入增強后,就產生一個結果代理類
-
Aspect(切面):是切入點和通知(引介)的結合
您可能還喜歡:
-
Spring框架系列(二)之Bean的注解管理
-
【SSH框架】之Spring系列(一)
-
【SSH框架】之Hibernate系列(一)
-
講講本人本專業找工作的那些事兒
-
前端系列之JavaScript基礎知識概述
?
本系列后期仍會持續更新,歡迎關注!
?
如果你認為這篇文章有用,歡迎轉發分享給你的好友!
本號文章可以任意轉載,轉載請注明出處!
?
掃碼關注微信公眾號,了解更多
轉載于:https://www.cnblogs.com/compassblog/p/8486478.html
總結
以上是生活随笔為你收集整理的Spring框架系列之AOP思想的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mininet的介绍安装
- 下一篇: 炽寒天凤值不值练