AOP底層原理剖析

 

 這是一個小的demo,進一步能理解AOPjava

 有接口用     GDK動態代理ide

 沒有接口     CGLIB動態代理this

 


 

package proxy;

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


interface LogService{   void doSave(); } interface UserService{ void doUpdate(); }

class LogServiceImpl implements LogService{//目標對象(target) @Override public void doSave() { //System.out.println("method start"); System.out.println("save log"); //System.out.println("method end"); } } class UserServiceImpl implements UserService{ @Override public void doUpdate() { System.out.println("update user"); } }


class LogAspect{//Aspect(切面) public void before(){//@Before System.out.println("method start"); } public void after(){//@After System.out.println("method end"); } } public class TestProxy01 { //在此類的對象方法中調用目標對象方法,添加業務擴展功能. static class ServiceHandler implements InvocationHandler{ private Object target;//目標對象 private LogAspect logAspect=new LogAspect(); public ServiceHandler(Object target) { this.target=target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //執行日誌切面方法(before) logAspect.before(); //執行目標對象方法(save) Object result=method.invoke(target, args); //執行日誌切面方法(after) logAspect.after(); return result; }//整合核心業務調用與擴展業務調用 } /**藉助JDK API(Proxy)爲目標對象建立動態代理對象*/ static Object newServiceProxy(Object target){ return Proxy.newProxyInstance( target.getClass().getClassLoader(),//loader target.getClass().getInterfaces(), //interfaces (目標對象實現的接口) new ServiceHandler(target));//handler } public static void main(String[] args) {
LogService logService
=(LogService) newServiceProxy(new LogServiceImpl());
System.out.println(logService.getClass().getName()); logService.doSave();
//當調用doSave方法,系統底層會調用Handler對象的 //invoke方法,執行核心業務與擴展業務的整合. //========================== UserService userService=(UserService) newServiceProxy(new UserServiceImpl()); userService.doUpdate(); } }
相關文章
相關標籤/搜索