【AOP系列】愛之初體驗(一)

【AOP系列】愛之初體驗

前言

在java開發的面試過程中少不了會問道Spring框架

然鵝 Spring框架最基本的兩個功能就是IOC和AOP。

本文就直說AOP

AOP是啥?

AOP紅酒是法國紅酒等級中最高的一級,屬於頂級酒。AOP紅酒就是原來的AOC紅酒。

2010法國葡萄酒新等級——AOC已成爲歷史,2009年10月的時候,法國國家葡萄酒行業協會新聞公報報道稱,爲了配合歐洲葡萄酒的級別標註形式,AOC葡萄酒(法定產區葡萄酒)變成AOP葡萄酒

不好意思複製錯了 - _ - `

AOP爲Aspect Oriented Programming的縮寫,是面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。AOP是OOP的延續,是軟件開發中的一個熱點,也是Spring框架中的一個重要內容,是函數式編程的一種衍生範型。

AOP的出現彌補了OOP的這點不足,AOP 是一個概念,一個規範,本身並沒有設定具體語言的實現,AOP是基於動態代理模式。AOP是方法級別的,要測試的方法不能爲static修飾,因爲接口中不能存在靜態方法,編譯就會報錯。

AOP可以分離業務代碼和關注點代碼(重複代碼),在執行業務代碼時,動態的注入關注點代碼。切面就是關注點代碼形成的類。Spring AOP中的動態代理主要有兩種方式,JDK動態代理和CGLIB動態代理。JDK動態代理通過反射來接收被代理的類,並且要求被代理的類必須實現一個接口。

哦,看了一大堆,到底想說啥?

舉個例子

List在增刪改查的時候,在控制檯上輸出一條記錄怎麼實現?

		List<String> list = new ArrayList<>();
		list.add("a");
		System.out.println("add:a");
		list.add("b");
		System.out.println("add:b");
		list.add("c");
		System.out.println("add:c");
		list.remove("c");
		System.out.println("remove:c");

寫好了 - _ - ~

別蠢了,現在要給所有的方法都添加日誌,就在所有的方法後面打印一下?

那麼看看AOP的方式實現

AopUtil.java

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.List;

public class AopUtil {

	public static List aop(List list){
		return (List)Proxy.newProxyInstance(null, new Class[]{List.class}, new Log(list));
	}
	
	static class Log implements InvocationHandler{
		Object target;	
		public Log(Object obj){
			this.target=obj;
		}
		@Override
		public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
			System.out.print(method.getName()+":");
			for (Object object : args) {
				System.out.print(object);
			}
			System.out.println();
			Object o=method.invoke(target, args);
			return o;
		}
	}
}
public class Main {
	public static void main(String[] args) throws Throwable{
		//原來寫法
		List<String> list = new ArrayList<>();
		list.add("a");
		System.out.println("add:a");
		list.add("b");
		System.out.println("add:b");
		list.add("c");
		System.out.println("add:c");
		list.remove("c");
		System.out.println("remove:c");
		
		List<String> aoplist = AopUtil.aop(list);//經過AOP處理的list
		aoplist.add("1");
		aoplist.add("2");
		aoplist.add("3");
		aoplist.remove("3");
		
		System.out.println(aoplist.equals(list));
		//true說明還是原來的list對象,只是把原來的對象進行了增強
	}
}

看下效果

在這裏插入圖片描述

鵝 美 淨~ (amazeing)

經過AOP動態代理處理後我們原來的List就有了,輸出的功能。

AOP具體運用在什麼地方呢?

日誌記錄,性能統計,安全控制,事務處理,異常處理等很多地方都會用到。

博文🌱

【AOP系列】愛之初體驗(一)

【AOP系列】靜態代理和動態代理(二)

【AOP系列】JDK動態代理源碼分析(三)

【AOP系列】自己動手實現一個JDK的Proxy類(四)

【AOP系列】一個切面類搞定請求日誌

【AOP系列】後端登錄這樣寫才香

【AOP系列】CGlib代碼跟讀

問題清單⭐

什麼是AOP?

什麼是動態代理?

動態代理有哪些實現方式?

爲啥要使用AOP?

JDK動態代理的原理是什麼?

JDK動態代理爲只能代理實現了接口的方法?

AOP的兩種底層實現性能分析和比較?

應用場景🎉

AOP結合 stopwatch 寫一個 請求時間的統計工具

AOP寫一個登錄攔截的功能

AOP寫一個日誌請求處理器

AOP簡單模擬@Transactional的事務處理

此博文中的源代碼都在這裏 aopdemo

這裏還有其他有意思的小demo GitHub

{
	"author": "大火yzs",
	"title": "【AOP系列】愛之初體驗",
	"tag": "AOP,List,日誌",
	"createTime": "2020-03-07  13:10"
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章