Spring的AOP实现

AOP01

SpringAOP是Spring framework中的一个核心设计,本文开始写一个系列主要有七种方式完成不同aop的实现,第一种用的是java的动态代理,使用的是Proxy代理类的静态方法newProxyInstance完成AOP的实现

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);

    /**
     * 根据用户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类的静态方法newProxyInstance来实现对于目标对象us的代理
         *  目的是在原本us可以做的事情之前和之后可以做额外的事情
         *
         */
        IUserService ius = (IUserService) Proxy.newProxyInstance(UserFactory.class.getClassLoader(), us.getClass().getInterfaces(), new InvocationHandler() {

            /**
             * 代理对象调用的回掉方法
             * @param proxy 代理对象
             * @param method 被代理的方法
             * @param args 被代理方法的参数列表对象
             * @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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容