如何模仿 WebMvcConfigurerAdapter 灵活的添加配置

  1. 问题描述

我在写一个框架,但是主要功能是下位机与上位机交互的协议类似json双方都可以灵活的通过几个索引表中寻找字段(例如这串二进制数据描述了一个业务模型,我需要将这串二进制数据解析成一个Java对象),为了框架的使用的灵活性,我想模仿Spring中的WebMvcConfigurerAdapter但是现在遇到了一个问题,我写出来的东西特别复杂,就不贴出来了,在此求助各路大神。

可以引用spring框架

类似以下这种配置方式

@Configuration
public class MyWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {
    /**
     * 配置静态访问资源
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/my/**").addResourceLocations("classpath:/my/");
        super.addResourceHandlers(registry);
    }
}
  1. 最终的目的
@Configuration
public class ProtocolIndexConfigurerAdapterImpl extends ProtocolIndexConfigurerAdapter {
    /**
     * 配置静态访问资源
     * @param registry
     */
    @Override
    public void addIndex(ProtocolIndexRegistry registry) {
       // 0001是在二进制串中描述某字段的意义,
       register.addTypeIndex("0001").register("id");
       register.addTypeIndex("0002").register("name");
    }
}
慕少森
浏览 433回答 1
1回答

浮云间

更新2: 突然想起来,你这个更类似拦截器、过滤器的配置啊,可以参考一下。 更新: interface ProtocolIndexConfigurer { void addIndex(ProtocolIndexRegistry registry); } abstract class ProtocolIndexConfigurerRegister { // 这里假设 registry 不是全局的,否则 configurer.addIndex(registry) 的调用形式很突兀 // 全局的话应该是 registry.addConfigurer(configurer) 这个你可以考虑一下 public abstract void register(); } 使用: @Component("conf1") class ProtocolIndexConfigurer1 implements ProtocolIndexConfigurer { @Override public void addIndex(ProtocolIndexRegistry registry) { // 注册行为... } } @Component("conf2") class ProtocolIndexConfigurer2 implements ProtocolIndexConfigurer { ... } class MyProtocolIndexConfigurerRegister extends ProtocolIndexConfigurerRegister { @Resource("conf1") private ProtocolIndexConfigurer conf1; // 注入,或者用 @bean 导入都行 @Resource("conf2") private ProtocolIndexConfigurer conf2; @Override public void register() { conf1.addIndex(new ProtocolIndexRegistry()); conf2.addIndex(new ProtocolIndexRegistry()); // 如果 ProtocolIndexRegistry 是全局的,那么就可以是 // registry.addConfigurer(conf1) .addConfigurer(conf2) ... // 但是这样改动可能比较大 } } 原答案: interface ProtocolIndexConfigurer { void addIndex(ProtocolIndexRegistry registry); } @ConditionOnMissingBean(name = "example") @Component class ProtocolIndexConfigurerAdapter implements ProtocolIndexConfigurer { @Override public void addIndex(ProtocolIndexRegistry registry) { /* 空实现 */ } } class SomewhereInjectProtocolIndexRegistry { @Autowired private final ProtocolIndexConfigurerAdapter adapter; protected void func() { ProtocolIndexRegistry registry = // get registry adapter.addIndex(registry); // save index mapping } } 使用: @Bean(name = "example") public SomeAdapter extends ProtocolIndexConfigurerAdapter { @Override public void addIndex(ProtocolIndexRegistry registry) { // do something here. } } 印象里是这样,你可以试一下,主要是 @ConditionOnxxx 注解的使用,给个空的默认实现避免找不到实现类抛异常。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java