Spring的AOP实现

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

IUserService.java

package com.qfedu.aop01;

import java.util.List;

public interface IUserService {

/**
 * 获取所有的用户对象列表
 * @return
 */
List getAllUser();

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

/**
 * 根据用户uid删除该uid对应的用户信息
 * @param uid
 * @return
 */
boolean deleteUser(int uid);

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

}

UserServiceImpl.java

package com.qfedu.aop01;

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

public class UserservcieImpl implements IUserService {

@Override
public List 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;
}

}

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

}

MyAspect.java

package com.qfedu.aop01;

public class MyAspect {

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

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

}

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

}

运行结果:

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

你可能感兴趣的:(Spring的AOP实现)