静态代理和动态代理

静态代理

可以在不修改原有代码的基础上实现功能增强的功能,但缺点是要对每一个需要增强的类新建一个代理类。

public class UserServiceImplProxy implements UserService {
    private UserServiceImpl userService;

    public UserServiceImplProxy() {
        this.userService = new UserServiceImpl();
    }

    @Override
    public void addUser() {
        System.out.println("添加前。。。");
        userService.addUser();
        System.out.println("添加后。。。");
    }
}

动态代理

  1. jdk动态代理 :需要实现接口
  2. cglib动态代理 :不需要实现接口
/**
 * 公共jdk动态代理对象生成
 * @return
 * ClassLoader loader 类加载器  ,通常指定的被代理类的接口的类加载器
 * Class<?>[] interfaces 类型, 通常指定被代理类的接口的类型
 * InvocationHandler h 委托执行的处理类 加强的功能写在这
 */
public  static Object createProxy(Object needProxy){
    ClassLoader loader = needProxy.getClass().getClassLoader();
    Class<?>[] interfaces = needProxy.getClass().getInterfaces();
    InvocationHandler handler = new MyInvocationHandler(needProxy);
    // 动态代理类的创建
    Object o = Proxy.newProxyInstance(loader, interfaces, handler);
    System.out.println("动态代理类:"+o);
    return o;
}

// 加强的处理类
public class MyInvocationHandler implements InvocationHandler {
    private Object target;

    public MyInvocationHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = null;
        try {
            System.out.println("前置通知。。。");
            result = method.invoke(target, args);

        }catch (Exception e){
            System.out.println("异常通知。。。");
        }finally {
            System.out.println("后置通知。。。");
        }

        return result;
    }

}

//测试
@Test
    public void test01(){
        UserService userService = (UserService) MainTest.createProxy(new UserServiceImpl());
        userService.addUser(new User());
    }

posted @ 2021-03-01 21:50  阿灿呀  阅读(66)  评论(0)    收藏  举报