问题描述
我在写一个框架,但是主要功能是下位机与上位机交互的协议类似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);
}
}
最终的目的
@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");
}
}
1 回答
浮云间
TA贡献1829条经验 获得超4个赞
更新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
注解的使用,给个空的默认实现避免找不到实现类抛异常。
添加回答
举报
0/150
提交
取消