Java动态代理:Spring AOP的实现

Posted by Kaka Blog on November 2, 2018

什么是动态代理

调用Proxy返回一个代理对象,使用这个代理对象执行你的方法时,它会先执行代理对象里的方法再执行你的业务方法。

作用

业务层代码专注业务处理,添加新功能时,如日志,事务等,不影响业务代码。

实践

1、添加一个接口:

public interface UserManager {
    public void add(String username, String password);
    public void del(int userId);
}

2、实现接口:

public class UserManagerImpl implements UserManager {
    @Override
    public void add(String username, String password) {
        System.out.println("---------UserMangerImpl.add()-----------");
    }

    @Override
    public void del(int userId) {
        System.out.println("---------UserMangerImpl.del()-----------");
    }
}

3、添加一个代理类:

public class SecurityHandler implements InvocationHandler {
    private Object target;

    private void checkSecurity() {
        System.out.println("-------------check security------------");
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        checkSecurity();
        return method.invoke(target, args);
    }

    public Object createProxyInstance(Object target) {
        this.target = target;
        /**
         * ClassLoader loader:Java类加载器; 一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载
         * Class<?>[] interfaces:被代理类的所有接口信息; 如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),便于生成的代理类可以具有代理类接口中的所有方法
         * InvocationHandler h:调用处理器; 调用实现了InvocationHandler 类的一个回调方法
         * */
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                this);
    }
}

4、测试

public class Test {
    public static void main(String[] args) {
        UserManager userManager = new UserManagerImpl();
        userManager.add("aaa", "123");
        userManager.del(123);

        SecurityHandler handler = new SecurityHandler();
        UserManager userManagerProxy = (UserManager) handler.createProxyInstance(new UserManagerImpl());
        userManagerProxy.add("aaa", "123");
        userManagerProxy.del(123);
    }
}