Spring的AOP實現(xiàn)

AOP01

SpringAOP是Spring framework中的一個核心設計,本文開始寫一個系列主要有七種方式完成不同aop的實現(xiàn),第一種用的是java的動態(tài)代理,使用的是Proxy代理類的靜態(tài)方法newProxyInstance完成AOP的實現(xiàn)

1.IUserService.java

package com.qfedu.aop01;

import java.util.List;

public interface IUserService<T> {

    /**
     * 獲取所有的用戶對象列表
     * @return
     */
    List<T> getAllUser();

    /**
     * 保存用戶
     * @param user
     * @return
     */
    boolean saveUser(T user);

    /**
     * 根據(jù)用戶uid刪除該uid對應的用戶信息
     * @param uid
     * @return
     */
    boolean deleteUser(int uid);

    /**
     * 更新指定用戶信息
     * @param obj
     * @return
     */
    boolean updateUser(T obj);
}

2.UserServiceImpl.java

package com.qfedu.aop01;

import java.util.ArrayList;
import java.util.List;

public class UserservcieImpl implements IUserService<Object> {

    @Override
    public List<Object> getAllUser() {
        System.out.println("--------getAllUser----------");
        return new ArrayList<>();
    }

    @Override
    public boolean saveUser(Object user) {
        System.out.println("--------saveUser----------");
        return true;
    }

    @Override
    public boolean deleteUser(int uid) {
        System.out.println("--------deleteUser----------");
        return false;
    }

    @Override
    public boolean updateUser(Object obj) {
        System.out.println("--------updateUser----------");
        return true;
    }
}

3.UserFactory.java

package com.qfedu.aop01;

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

public class UserFactory {

    public static IUserService getUserService(){

        IUserService us = new UserservcieImpl();

        MyAspect ma = new MyAspect();

        /**
         *
         *  使用Proxy類的靜態(tài)方法newProxyInstance來實現(xiàn)對于目標對象us的代理
         *  目的是在原本us可以做的事情之前和之后可以做額外的事情
         *
         */
        IUserService ius = (IUserService) Proxy.newProxyInstance(UserFactory.class.getClassLoader(), us.getClass().getInterfaces(), new InvocationHandler() {

            /**
             * 代理對象調(diào)用的回掉方法
             * @param proxy 代理對象
             * @param method 被代理的方法
             * @param args 被代理方法的參數(shù)列表對象
             * @return 每個方法的最終返回值
             * @throws Throwable
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                ma.before();

                //System.out.println(proxy);
                System.out.println("000000000" + method);
                System.out.println("000001111" + args);

                Object obj = method.invoke(us, args);

                ma.after();

                System.out.println("111111111" + obj);
                return obj;
            }
        });

        return ius;
    }
}

4.MyAspect.java

package com.qfedu.aop01;

public class MyAspect {

    public void before(){
        System.out.println("********before**********");
    }

    public void after(){
        System.out.println("********after**********");
    }
}

5.TestAOP01.java

package com.qfedu.aop01;

import org.junit.Test;

public class TestAOP01 {

    @Test
    public void testUserService(){
        IUserService us = new UserservcieImpl();

        System.out.println(us.getAllUser());
        System.out.println(us.updateUser(new Object()));
        System.out.println(us.deleteUser(1));
        System.out.println(us.saveUser(new Object()));

        System.out.println("===============");

        IUserService us2 = UserFactory.getUserService();

        System.out.println(us2.getAllUser());
        System.out.println(us2.updateUser(new Object()));
        System.out.println(us2.deleteUser(2));
        System.out.println(us2.saveUser(new Object()));
    }
}

6.運行結果

--------getAllUser----------
[]
--------updateUser----------
true
--------deleteUser----------
false
--------saveUser----------
true
===============
********before**********
000000000public abstract java.util.List com.qfedu.aop01.IUserService.getAllUser()
000001111null
--------getAllUser----------
********after**********
111111111[]
[]
********before**********
000000000public abstract boolean com.qfedu.aop01.IUserService.updateUser(java.lang.Object)
000001111[Ljava.lang.Object;@6ae40994
--------updateUser----------
********after**********
111111111true
true
********before**********
000000000public abstract boolean com.qfedu.aop01.IUserService.deleteUser(int)
000001111[Ljava.lang.Object;@1a93a7ca
--------deleteUser----------
********after**********
111111111false
false
********before**********
000000000public abstract boolean com.qfedu.aop01.IUserService.saveUser(java.lang.Object)
000001111[Ljava.lang.Object;@3d82c5f3
--------saveUser----------
********after**********
111111111true
true

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容