8 署理计划模式

手机游戏开发者 2024-9-18 00:11:01 51 0 来自 中国
署理模式是紧张对我们方法实行之前与之后实现加强。
署理模式应用场景
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");    }}动态署理与静态署理的区别
动态署理不必要写署理类对象,通过步伐自动天生,而静态署理必要我们本身写署理类对象。
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-19 00:26, Processed in 0.162410 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表