这两天研究了一下Java的动态代理,自己闲着无聊,用动态代理模拟了一下Spring的AOP,代码如下,当然真正的Spring是直接操作二进制文件,很复杂,有兴趣的可以自己研究下。


package cn.bridgeli.aop;

public interface UserService {
    void addUser();
}

package cn.bridgeli.aop;

public class UserServiceImpl implements UserService {

    public void addUser() {
        System.out.println("User add…");
    }

}

package cn.bridgeli.aop;

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

public class UserServiceProxy implements InvocationHandler {

    private UserService userService;

    public UserServiceProxy(UserService userService) {
        this.userService = userService;
    }
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("User add start…");
        Object object = method.invoke(userService, args);
        System.out.println("User add end…");
        return object;
    }

}

package cn.bridgeli.aop;

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

import org.junit.Test;

public class UserServiceTest {
    @Test
    public void testAddUser() {
        UserService userService = new UserServiceImpl();
        InvocationHandler invocationHandler = new UserServiceProxy(userService);
        UserService userServiceProxy = (UserService) Proxy.newProxyInstance(userService.getClass().getClassLoader(), userService.getClass().getInterfaces(), invocationHandler);
        userServiceProxy.addUser();
    }
}