美文网首页
总线模式

总线模式

作者: hemiao3000 | 来源:发表于2022-02-03 15:00 被阅读0次

::: tip
『总线模式』并非 23 种设计模式之一。它更像是一种编程技巧。
:::

@Slf4j
@Component
@SuppressWarnings("UnstableApiUsage")
public class Bus implements ApplicationListener<ApplicationStartedEvent> {

    private final ApplicationContext context;

    /**
     * 两张注册表, 
     * - handlerMap 的 value 是业务类对象, 
     * - methodMap 的 value 是业务类的方法对象,
     * - 二者的 key 都是业务方法的参数类对象
     */
    private final Map<Class<?>, Object> handlerMap = new HashMap<>();
    private final Map<Class<?>, Method> methodMap = new HashMap<>();

    public Bus(ApplicationContext context) {
        this.context = context;
    }

    /**
     * 注册
     */
    public void register(Class<?> argumentType, Object target, Method method) {
        handlerMap.put(argumentType, target);
        methodMap.put(argumentType, method);
    }

    /**
     * 执行方法
     */
    public void post(Object argument) {
        Class<?> argumentType = argument.getClass();
        Object target = handlerMap.get(argumentType);   // 获取已注册的业务层 handler 对象
        Method method = methodMap.get(argumentType);    // 获取已注册的业务方法 handle 对象
        ReflectionUtils.invokeMethod(method, target, argument);     // 调用对应的业务方法
    }

    @Override
    public void onApplicationEvent(ApplicationStartedEvent event) {
        log.info("Spring IoC 已初始化完成");
        String[] names = context.getBeanNamesForAnnotation(Service.class);
        for (String name : names) {
            log.info(name);
            Object serviceBean = context.getBean(name);

            // 找到当前 @Service 类下的所有方法
            Method[] methods = ReflectionUtils.getAllDeclaredMethods(serviceBean.getClass());
            for (Method method : methods) {
                // 筛选出当前 @Service 类下带有 @Subscribe 注解的方法
                if (!ObjectUtils.isEmpty(method.getAnnotation(Subscribe.class))){
                    Class<?> parameterType = method.getParameterTypes()[0];
                    // 注册
                    register(parameterType, serviceBean, method);
                }
            }
        }
    }
}

相关文章

  • 总线模式

    ::: tip『总线模式』并非 23 种设计模式之一。它更像是一种编程技巧。:::

  • 数据总线模式

    一、核心的数据分发器 1.Member 代表订阅的组件2.subscribe:将所有的业务组件加入到了一个集合中3...

  • 非父子组件的传值问题

    1、Bus/总线/发布订阅模式/观察者模式的方法;2、Vuex方法;

  • Vue组件通信

    父组件传值子组件 子组件传值父组件 非父子组件通信 发布订阅模式 / 总线模式 我们使用一个空的Vue实例作为总线...

  • Vue非父子组件间传值

    也称为Bus / 总线 / 发布订阅模式 / 观察者模式 通过localStorage或者sessionStora...

  • AHB总线burst不能跨越1k边界的实现

    AHB总线的burst传输,其中的控制信号为HBURST,AHB总线规定burst传输模式,地址不能跨越1k边界,...

  • Android系统架构(一) 事件总线

    事件总线。继承自观察者模式,事件总线也是基于发布订阅的机制来实现事件的发送和接受的。 为何要使用 Android ...

  • Android开源框架如何说-EventBus3

    概念Eventbus是一个专门为Android平台优化定制的事件总线函数库,事件总线,继承自观察者模式,也是基于发...

  • 各种总线传输速率总结

    1. USB总线 USB1.1: -------低速模式(low speed):1.5Mbps -------全...

  • 11.非父子组件之间的传值

    1.非父子组件之间的传值 1.1 vuex本章暂时不讲2.1 总线模式/Bus/观察者模式/发布订阅模式

网友评论

      本文标题:总线模式

      本文链接:https://www.haomeiwen.com/subject/atbrkrtx.html