动态代理

1.使用reflect包中Proxy实现
Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)
    loader: 类加载器,使用AppClassLoader加载器即可
    interfaces: 委托类的所有接口
    invocationHandler: 实现代理需要的一个接口

public interface InvocationHandler {
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
}
    proxy:委托类
    method: 调用的方法
    args: 调用方法的参数
2.具体实现
2.1 User.java
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {
    private String username;
    private String password;
}
2.2 代理类和委托类都实现的接口
public interface IUserDao {
    void saveUser(User user);
    int updateUser(User user);
}
2.3 委托类(如果委托类没有实现接口 需要使用cglib实现动态代理)
public class UserDaoImpl implements IUserDao {
    @Override
    public void saveUser(User user) {
        System.out.println("UserDaoImpl save user.");
    }

    @Override
    public int updateUser(User user) {
        System.out.println("UserDaoImpl update user.");
        return 0;
    }
}
2.4 代理类
public class UserDynamicsProxy implements InvocationHandler {
    private T target;

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("proxy before.");
        Object result = method.invoke(target, args);
        System.out.println("proxy after");
        return result;
    }

    public T proxy(T target) {
        this.target = target;
        return (T) Proxy.newProxyInstance(UserDynamicsProxy.class.getClassLoader(), target.getClass().getInterfaces(), this);
    }
}
3.测试
@Test
public void testDynamicsProxy() {
    User user = new User();
    IUserDao userDao = new UserDaoImpl();
    IUserDao proxyUserDao = new UserDynamicsProxy().proxy(userDao);
    proxyUserDao.saveUser(user);
}

上一篇静态代理:https://www.jianshu.com/u/f18ffbf46091

你可能感兴趣的:(动态代理)