深度好文
https://jiayouxujin.github.io/2019/04/20/java动态绑定和静态绑定详解/
在写项目的时候,有一个项目是只能定义一个父类,但是根据数据类型的不同需要选取不同的子类。但是父类是不能访问子类的程序的,所以就必须在程序里去实现该功能。
第一步,将父类看做一种类型,循环缓存所有该类型的子类。
@Configuration
public class Config {
List<Class> protocols =new ArrayList<Class>();
@Bean
public SpringInitializer springInitializer(){
protocols.add(DataProcess.class);
return new SpringInitializer(protocols);
}
@Bean
public CacheManagerHandler cacheManagerHandler(){
return new CacheManagerHandler();
}
@Bean
public ICache cmdCacheProvider(){
return new RamCacheProvider();
}
}
@Service
public class DataProcess implements IDataProcess {
protected int cmdId = 0xFFFF;
@Resource
ICache cmdCacheProvider;
@Override
public void parse(byte[] content, MessageContext context) {
}
@Override
public byte[] pack(MessageContext context, Object... argus) {
return new byte[0];
}
@Override
public void init() {
cmdCacheProvider.put(cmdId, this); //缓存cmdId 和 父类对象
}
}
@Slf4j
public class SpringInitializer implements ApplicationListener<ContextRefreshedEvent> {
private List<Class> protocols;
public SpringInitializer( List<Class> protocolss){
this.protocols = protocolss;
}
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
log.info("初始化 ...",protocols);
for (Class protocol : protocols) {
Map parses = InitUtil.getBeansOfType(protocol);
for (Iterator iterator = parses.keySet().iterator(); iterator.hasNext(); ) {
String key = (String) iterator.next();
IDataProcess process = (IDataProcess) parses.get(key);
process.init();
log.info("初始化[{}] ...",key);
}
}
}
}
第二、根据不同类型,动态绑定不同的类
DataProcess process= (DataProcess)cmdCacheProvider.get(context.getCmdID());
if(process != null){
System.out.println("处理handler接收数据"+context);
// this.parse(context.getMsgBody(),context);
process.parse(context.getMsgBody(),context);
}
三、在数据进来的时候根据不同数据类型选择不同的子类 相当于 father c = new Child();
来源:CSDN
作者:如果丶可以坑
链接:https://blog.csdn.net/qq_35642849/article/details/104006946