静态代理

这个Proxyer代理类需要用户手动去创建,一般来说一个需要代理的类一个Proxyer

AOP之类的都用到了动态代理

  • 目标类接口
public interface UserService{
	String getUsername(int id);
}
  • 目标类具体实现
public class UserServiceImpl implements UserService{
	public String getUsername(int id){
		System.out.println("张三:"+id);
		return "张三:"+id;
	}
}
  • 代理类
public class Proxyer{
	private final UserService userService;
	public Proxyer(UserService userService){
		this.userService = userService;
	}
	public String getUsername(int id){
		System.out.println("目标方法执行--------前");
		String username =userService.getUsername(id);
		System.out.println("目标方法执行--------后");
		return username;
	}
}
  • 测试类
public class Test {
    public static void main(String[] args) {
        UserService userService = new UserServiceImpl();//直接将具体实现传入如果要代理这个接口的其他实现,也可以new其他的实现传入
        Proxyer proxyer = new Proxyer(userService);
        proxyer.getUserName(1);
    }
}

动态代理

  • 目标类接口
与上面静态代理的一样
  • 目标类具体实现
与上面静态代理的一样
  • 代理类
public class MyInvocationHandler implements InvocationHandler {
	private final Object target;

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

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("目标方法执行--------前");
        Object invoke = method.invoke(target, args);
        System.out.println("目标方法执行--------后");
        return invoke;
	}
}
  • 测试类
public class Test {
	public static void main(String[] args) throws Exception {
		UserService target = new UserServiceImpl();
		MyInvocationHandler handler = new MyInvocationHandler(target);
		UserService proxy = (UserService) Proxy.newProxyInstance(
				target.getClass().getClassLoader(),
				target.getClass().getInterfaces(),
				handler);
		// 调用目标方法
		proxy.getUserName(1);
	}
}

CGLib动态代理

  • 目标类对象
public class UserService {
    public String getUser(int id) {
        return "wyl:"+id;
    }
}
  • 拦截器
public class UserServiceInterceptor implements MethodInterceptor {

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("目标方法执行--------前");
        Object invoke = methodProxy.invokeSuper(o, objects);
        System.out.println("目标方法执行--------后");
        return invoke;
    }
}
  • 测试
public class CglibProxyer {
    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(UserService.class);
        enhancer.setCallback(new UserServiceInterceptor());
        UserService userService = (UserService) enhancer.create();
        System.out.println(userService.getUser(1));
    }
}