【Android AOP--01】Android使用AspectJ來實現AOP程式設計
前言
小夥伴們,大家好,我是嘮嗑,很長時間沒有更新Android系列文章了,最近研究了一下AOP,覺得很有意思,也很實用,所以打算寫一個關於AOP的系列文章,和大家一起探討學習。
其實在去年,我就在專案中用過了一次AOP,大家可以看看。
ofollow,noindex">Android AOP面向切面程式設計詳解接下來就帶小夥伴學習一下,如何在你的專案中使用AOP。
使用AOP,是需要做一大堆配置的,為了方便,我們使用滬江同學的開源專案 AspectJ
https://github.com/HujiangTechnology/gradle_plugin_android_aspectjx
使用步驟
1、在專案的根目錄的build.gradle中新增如下依賴
dependencies { classpath 'com.android.tools.build:gradle:2.3.3' classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }
2、在app.gradle中新增如下
apply plugin: 'android-aspectjx' //或者這樣也可以 apply plugin: 'com.hujiang.android-aspectjx' dependencies { //aspectjrt的依賴 compile 'org.aspectj:aspectjrt:1.8.9' }
到這裡,配置就算完成了。這是我目前使用過的最簡單的配置了。
通過一個小例子來講解
平時我們經常會用到Log日誌,比如在Activity的所有生命週期的方法中加一條Log。
下面一起來看看通過AOP是如何實現的。
建立一個AspectTest類
@Aspect public class AspectTest { final String TAG = AspectTest.class.getSimpleName(); /** * 在MainActivity的所有生命週期的方法中列印log * @param joinPoint * @throws Throwable */ @Before("execution(* *..MainActivity+.on**(..))") public void method(JoinPoint joinPoint) throws Throwable { MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); String className = joinPoint.getThis().getClass().getSimpleName(); Log.e(TAG, "class:" + className); Log.e(TAG, "method:" + methodSignature.getName()); } }
MainActivity
只需要新增生命週期的幾個方法即可。
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override protected void onStart() { super.onStart(); } @Override protected void onResume() { super.onResume(); } @Override protected void onPause() { super.onPause(); } @Override protected void onStop() { super.onStop(); } @Override protected void onDestroy() { super.onDestroy(); }
看看列印結果


怎麼樣?很簡潔方便吧。用AOP一個最大的好處是:在不入侵原有程式碼的情況下,可以對同一功能統一處理,比如檢查登入,檢查許可權,防止按鈕二次點選等。