springBoot 动态绑定类

       

深度好文

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();

 

发布了28 篇原创文章 · 获赞 1 · 访问量 2万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览