1.什么是代理设计模式
在目标方法之前或之后实现增强
2.代理模式角色
被代理类
代理类
抽象主体角色
3.代理模式实现方式
实现方式 | ||
静态代理:人为创建好代理类 | 继承 | |
实现 | ||
动态代理:通过反射或者字节码自动创建代理类 | JDK动态代理 | |
CGLIB动态代理 |
4.静态代理-继承方式
链接:https://pan.baidu.com/s/17qOg4S8qVxBx2i5m4ARHsw
提取码:37pr
1)定义共同的抽象方法
public interface OrderService {
/**
* 共同抽象的方法
*/
void order();
}
2)定义实现类
import com.demo.service.OrderService;
public class OrderServiceImpl implements OrderService {
public void order() {
System.out.println("执行订单业务逻辑代码");
}
}
3)代理类
import com.demo.service.impl.OrderServiceImpl;
public class OrderServiceProxy extends OrderServiceImpl {
public void order() {
System.out.println(">>>打印订单日志开始");
super.order();
System.out.println(">>>打印订单日志结束");
}
}
4)测试
public class Test {
public static void main(String[] args) {
OrderServiceProxy orderServiceProxy = new OrderServiceProxy();
orderServiceProxy.order();
}
}
5.静态代理-实现方式
链接:https://pan.baidu.com/s/1JAvv48CZHJT0hWg4z3VAHw
提取码:i8n2
1)共同的抽象类
public interface OrderService {
/**
* 共同抽象的方法
*/
void order();
}
2)实现类
import com.demo.service.OrderService;
public class OrderServiceImpl implements OrderService {
public void order() {
System.out.println("执行订单业务逻辑代码");
}
}
3)代理类
import com.demo.service.OrderService;
public class OrderServiceProxy implements OrderService {
private OrderService orderService;
public OrderServiceProxy(OrderService orderService) {
this.orderService = orderService;
}
public void order() {
System.out.println(">>>打印订单日志开始");
orderService.order();
System.out.println(">>>打印订单日志结束");
}
}
4)测试类
import com.demo.proxy.OrderServiceProxy;
import com.demo.service.impl.OrderServiceImpl;
public class Test {
public static void main(String[] args) {
OrderServiceProxy orderServiceProxy = new OrderServiceProxy(new OrderServiceImpl());
orderServiceProxy.order();
}
}
6.动态代理-JDK动态代理
链接:https://pan.baidu.com/s/1xf95nCmHnaYc5fdYkqxSfw
提取码:flwm
1)共同的抽象方法
public interface OrderService {
/**
* 共同抽象的方法
*/
void order();
}
2)实现类
import com.demo.server.OrderService;
public class OrderServiceImpl implements OrderService {
public void order() {
System.out.println("执行订单业务逻辑代码");
}
}
3)代理类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JdkInvocationHandler implements InvocationHandler {
/**
* 被代理类对象 目标代理对象
*/
private Object target;
public JdkInvocationHandler(Object target) {
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(">>>jdk打印订单日志开始:proxy:" + proxy.getClass().toString());
Object reuslt = method.invoke(target, args);// java的反射机制执行方法 执行目标对象的方法
System.out.println(">>>jdk打印订单日志结束");
return reuslt;
}
/**
* 使用jdk动态代理创建代理类
* @param <T>
* @return
*/
public <T> T getProxy() {
return (T)Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
}
4)测试类
import com.demo.proxy.JdkInvocationHandler;
import com.demo.server.OrderService;
import com.demo.server.impl.OrderServiceImpl;
public class Test {
public static void main(String[] args) {
OrderService proxy = new JdkInvocationHandler(new OrderServiceImpl()).getProxy();
proxy.order();
}
}
7.动态代理-CGLIB动态代理
链接:https://pan.baidu.com/s/1cN7lfQgdYJJMpG19XenRaw
提取码:gge3
1)pom依赖
<dependencies>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.2.12</version>
</dependency>
</dependencies>
2)共同的抽象类
public interface OrderService {
/**
* 共同抽象的方法
*/
void order();
}
3)实现类
import com.demo.server.OrderService;
public class OrderServiceImpl implements OrderService {
public void order() {
System.out.println("执行订单业务逻辑代码");
}
}
4)代理类
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class CglibMethodInterceptor implements MethodInterceptor {
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println(">>>>cglib日志收集开始....");
Object reuslt = proxy.invokeSuper(obj, args);
System.out.println(">>>>cglib日志收集结束....");
return reuslt;
}
}
5)测试类
import com.demo.proxy.CglibMethodInterceptor;
import com.demo.server.impl.OrderServiceImpl;
import net.sf.cglib.proxy.Enhancer;
public class Test {
public static void main(String[] args) {
CglibMethodInterceptor cglibMethodInterceptor = new CglibMethodInterceptor();
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(OrderServiceImpl.class);
enhancer.setCallback(cglibMethodInterceptor);
OrderServiceImpl orderServiceImpl = (OrderServiceImpl)enhancer.create();
orderServiceImpl.order();
}
}