静态代理
这个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));
}
}