工厂模式创建动态代理实现类

通过工厂,,传入指定的接口类型,,动态代理生成增强的实现类:

用到的例子:

  • langchain4j中AiService,传入指定的接口,创建增强的实现类,通过@SystemMessage @UserMessage 动态组装内容发送给ai
  • Mybatis的mapper,, 也是这种,通过SqlSession.getMapper(接口) ,,解析接口上面的注解,获取动态代理实现类
  • Spring data JPA
  • spring cloud openfeign
简单版

定义一个注解:

java 复制代码
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoMethod {

    String value() default "";
}

接口:

java 复制代码
public interface MessageService {


    @AutoMethod("发送邮件: %s,,内容:%s")
    String sendEmail(String to,String content);

    @AutoMethod("发送sms: %s,,内容:%s")
    String sendSms(String to,String content);
}

定义一个工厂,动态创建这个接口的实现类,,拦截注解:

java 复制代码
public class SimpleServiceFactory {


    public static <T> T create(Class<T> serviceClass){

        return (T) Proxy.newProxyInstance(serviceClass.getClassLoader(), new Class[]{serviceClass}, new SimpleInvocationHandler());

    }


    static class SimpleInvocationHandler implements InvocationHandler{

        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

            AutoMethod annotation = method.getAnnotation(AutoMethod.class);
            if (annotation != null){
                String template = annotation.value();
                return String.format(template,args);
            }else{
                return "执行"+method.getName();
            }

        }
    }
}

使用:

java 复制代码
public class Demo01 {

    public static void main(String[] args) {
        MessageService service = SimpleServiceFactory.create(MessageService.class);


        String s = service.sendEmail("xxx@qq.com", "hello");
        System.out.println("s = " + s);


        String s1 = service.sendSms("137090xxx", "hehe123");
        System.out.println("s1 = " + s1);
        
    }

}
增强版

通过拦截注解,,调用不同的实现类

java 复制代码
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MsgHandler {

    // 消息类型
    String type();
    // 执行动作
    String action();

}
java 复制代码
public interface MessageHandler {

    @MsgHandler(type = "email", action = "send")
    void handleEmail(String to, String content);

    @MsgHandler(type = "sms", action = "send")
    void handleSms(String phone, String message);

    @MsgHandler(type = "log", action = "record")
    void logMessage(String message);
}
java 复制代码
/**
 * 消息处理器
 */
public interface MsgProcessor {

    void process(Object[] args);
}
java 复制代码
package com.cj.aikefu.hehe02;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.HashMap;
import java.util.Map;

public class EnhancedServiceFactory {
    private static final Map<String,MsgProcessor> processors = new HashMap<>();

    static {
        processors.put("email-send",args->{
            System.out.println("email send"+args[0]+args[1]);
        });
        processors.put("sms-send",args -> {
            System.out.println("send sms"+args[0]+args[1]);
        });
    }

    public static <T> T create(Class<T> serviceClass){
       return (T) Proxy.newProxyInstance(serviceClass.getClassLoader(),new Class[]{serviceClass},new EnhancedInvocationHandler());
    }

    static class EnhancedInvocationHandler implements InvocationHandler {
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            MsgHandler annotation = method.getAnnotation(MsgHandler.class);
            if (annotation != null){
                String key = annotation.type() + "-" + annotation.action();
                MsgProcessor msgProcessor = processors.get(key);
                if (msgProcessor != null){
                    msgProcessor.process(args);
                }else{
                    System.out.println("未找到处理器"+key);
                }
            }

            return null;
        }
    }

}

测试:

java 复制代码
public class Demo01 {

    public static void main(String[] args) {
        MessageHandler handler = EnhancedServiceFactory.create(MessageHandler.class);
        handler.handleEmail("xxx","hello");
        handler.handleSms("123","hehe123");
    }
}
相关推荐
宇木灵3 小时前
C语言基础学习-二、运算符
c语言·开发语言·学习
无心水3 小时前
【任务调度:数据库锁 + 线程池实战】3、 从 SELECT 到 UPDATE:深入理解 SKIP LOCKED 的锁机制与隔离级别
java·分布式·科技·spring·架构
yangSimaticTech4 小时前
沿触发的4个问题
开发语言·制造
编程小白gogogo4 小时前
苍穹外卖图片不显示解决教程
java·spring boot
舟舟亢亢4 小时前
算法总结——二叉树【hot100】(上)
java·开发语言·算法
百锦再4 小时前
Java中的char、String、StringBuilder与StringBuffer 深度详解
java·开发语言·python·struts·kafka·tomcat·maven
普通网友5 小时前
多协议网络库设计
开发语言·c++·算法
努力努力再努力wz5 小时前
【Linux网络系列】:TCP 的秩序与策略:揭秘传输层如何从不可靠的网络中构建绝对可靠的通信信道
java·linux·开发语言·数据结构·c++·python·算法
daxi1505 小时前
C语言从入门到进阶——第9讲:函数递归
c语言·开发语言·c++·算法·蓝桥杯
勇气要爆发6 小时前
LangGraph 实战:10分钟打造带“人工审批”的智能体流水线 (Python + LangChain)
开发语言·python·langchain