署理模式是紧张对我们方法实行之前与之后实现加强。
署理模式应用场景
1,日记收罗
2,权限控制
3,实现aop
4,mybatis mapper
5,Spring的变乱
6,全局捕捉非常
7,rpc远程调用接口(通报就是接口)
8,署理数据源
9,自界说注解
aop---基于署理实现
署理模式实现的原理
署理模式紧张包罗三个脚色,即抽象主题脚色(Subject),委托类脚色(被署理脚色,Proxied)以及署理类脚色(Proxy)
抽象主题脚色:可以是接口,也可以是抽象类;
委托类脚色: 真实主题脚色,业务逻辑的详细实行者;
署理类脚色: 内部含有对真实对象RealSubject的引用,负责对真实主题脚色的调用,并在真实主题脚色处理处罚前后做预处理处罚和后处理处罚。
署理模式创建方式:
干系测试代码:
package com.taotao.proxy.service;/** * @Author: wangjin * @CreateTime: 2022-07-03 21:23 */public interface OrderService { /** * 追加订单数据 */ String addOrder(String orderName);}package com.taotao.proxy.service.impl;import com.taotao.proxy.service.OrderService;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Service;/** * @Author: wangjin * @CreateTime: 2022-07-03 21:24 */@Service("OrderService")@Slf4jpublic class OrderServiceImpl implements OrderService { @Override public String addOrder(String orderName) { log.info("<orderName:{}>", orderName); log.info("addOrder方法之后处理处罚"); return "OK"; }}package com.taotao.proxy.service.proxy;import com.taotao.proxy.service.OrderService;import lombok.extern.slf4j.Slf4j;/** * @Author: wangjin * @CreateTime: 2022-07-03 21:37 */@Slf4jpublic class OrderServiceProxy implements OrderService { //署理类 到底是必要调用哪一个 被署理类 private OrderService orderService; public OrderServiceProxy(OrderService orderService) { this.orderService = orderService; } @Override public String addOrder(String orderName) { log.info("<在adder方法之前处理处罚 orderName:{}>", orderName); String resultString = orderService.addOrder(orderName);//调用被署理类 return resultString; }}package com.taotao.proxy.service;import com.taotao.proxy.service.impl.OrderServiceImpl;import com.taotao.proxy.service.proxy.OrderServiceProxy;/** * @Author: wangjin * @CreateTime: 2022-07-03 21:44 */public class Test01 { public static void main(String[] args) { //被署理类 OrderServiceProxy orderServiceProxy=new OrderServiceProxy(new OrderServiceImpl()); String result= orderServiceProxy.addOrder("hello"); System.out.println(result); }}package com.taotao.proxy.service;import com.taotao.proxy.service.proxy1.OrderServiceProxy;/** * @Author: wangjin * @CreateTime: 2022-07-03 21:56 */public class Test02 { public static void main(String[] args) { OrderServiceProxy orderServiceProxy=new OrderServiceProxy(); String result= orderServiceProxy.addOrder("oooo"); System.out.println(result); }}package com.taotao.proxy.service.proxy1;import com.taotao.proxy.service.impl.OrderServiceImpl;import lombok.extern.slf4j.Slf4j;/** * @Author: wangjin * @CreateTime: 2022-07-03 21:51 */@Slf4jpublic class OrderServiceProxy extends OrderServiceImpl { //让我们署理类 继承 署理类 @Override public String addOrder(String orderName) { log.info("<在addOrder方法之前处理处罚 orderName:{}>",orderName); String result=super.addOrder(orderName); //目标方法 实行 被署理类 log.info("<在addOrder方法之后处理处罚 orderName:{}>",orderName); return result; }}动态署理是在实现阶段不用关心署理类,而是在运行阶段才指定哪一个对象。
动态署理类的源码是在步伐运行期间由JVM根据反射等机制动态天生。
jdk动态署理的一样平常步调如下:
1,创建被署理的接口和类
2,实现InvocationHandler接口,对目标接口中声明的全部方法举行同一处理处罚;
3,调用Proxy的静态方法,创建署理类并天生相应的署理对象;
实现原理: 使用拦截器机制必须实现InvocationHandler 接口中的invoke方法实现对我们的目标方法加强
JDK API 动态署理方法:
package com.taotao.proxy.service;import lombok.extern.slf4j.Slf4j;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * @Author: wangjin * @CreateTime: 2022-07-03 22:36 */@Slf4jpublic class JdkInvocationHandler implements InvocationHandler { /** * 目标对象 */ private Object target; public JdkInvocationHandler(Object target){ this.target=target; } /** * * @param proxy jdk自动天生好的署理类 * @param method 木目标对象的接口 * @param args 参数类 * @return * @throws Throwable */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { log.info("<jdk动态署理目标方法之前>,args:{}",args); Object result=method.invoke(target,args); log.info("<jdk动态署理目标方法之后,args:{}", args); return result; } public <T> T getProxy() { return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); }}package com.taotao;import com.taotao.proxy.service.JdkInvocationHandler;import com.taotao.proxy.service.OrderService;import com.taotao.proxy.service.impl.OrderServiceImpl;/** * @Author: wangjin * @CreateTime: 2022-07-05 22:25 */public class Test03 { public static void main(String[] args) { OrderService orderService=new JdkInvocationHandler(new OrderServiceImpl()).getProxy(); orderService.addOrder("taotao"); }}动态署理与静态署理的区别
动态署理不必要写署理类对象,通过步伐自动天生,而静态署理必要我们本身写署理类对象。 |