package com.aop; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import java.util.List; import io.realm.Realm; import io.realm.RealmObject; import rx.Observable; import rx.functions.Action1; import rx.functions.Func1; /** * 数据库切片,根据注解DbRealm,缓存方法中含有需要缓存到数据库的RealmObject的参数 * Created by baixiaokang on 17/1/24. */ @Aspect public class DbRealmAspect { @Pointcut("execution(@com.app.annotation.aspect.DbRealm * *(..))")//方法切入点 public void methodAnnotated() { } @Around("methodAnnotated()")//在连接点进行方法替换 public void aroundJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable { joinPoint.proceed();//执行原方法 Realm realm = Realm.getDefaultInstance(); Observable.from(joinPoint.getArgs()) .filter(new Func1<Object, Boolean>() { @Override public Boolean call(Object obj) { return obj instanceof RealmObject || obj instanceof List; } }) .subscribe( new Action1<Object>() { @Override public void call(Object obj) { realm.beginTransaction(); if (obj instanceof List) realm.copyToRealmOrUpdate((List) obj); else realm.copyToRealmOrUpdate((RealmObject) obj); realm.commitTransaction(); } }, new Action1<Throwable>() { @Override public void call(Throwable e) { e.printStackTrace(); } }); } }