美文网首页
BeeHive 源码

BeeHive 源码

作者: helinyu | 来源:发表于2022-01-07 16:36 被阅读0次

XNBeeHive 修改之后的源码

应用上

{
        [BHContext shareInstance].application = application;
        [BHContext shareInstance].launchOptions = launchOptions;
        [BHContext shareInstance].moduleConfigName = @"BeeHive.bundle/BeeHive";//可选,默认为BeeHive.bundle/BeeHive.plist
        [BHContext shareInstance].serviceConfigName = @"BeeHive.bundle/BHService";
        [BHContext shareInstance].lazy_moduleConfigName = @"BeeHive.bundle/BeeHive_lazy";
        [BHContext shareInstance].lazy_serviceConfigName = @"BeeHive.bundle/BHService_lazy";
        [BeeHive shareInstance].enableException = NO;
      // 上面配置 有关的参数: module 和service ,以及有关的参数,
      // enableException 由于增加了动态规则的寻找, 所以,这个设置为NO取消掉

        [[BeeHive shareInstance] setContext:[BHContext shareInstance]]; 
// 设置对应的内容, 这个是对应的入口
        
        [super application:application didFinishLaunchingWithOptions:launchOptions];
    }
    
BHSelectorByEvent  <事件key: 方法>
BHModulesByEvent <事件key:modules<NSArray>> 这就是通过一个这样的时间有多少个模块
modulesByName; // 存储模块对象:通过名字来获取模块
servicesByName; // 存储服务对象 : 目前是存储用去作为单例的
@interface BHModuleManager()
@property(nonatomic, strong) NSMutableArray     *BHModuleDynamicClasses; // 没有使用到的
@property(nonatomic, strong) NSMutableArray<NSDictionary *>     *BHModuleInfos; // 所有的modules信息
@property(nonatomic, strong) NSMutableArray     *BHModules; // 所有的Modules
@property(nonatomic, strong) NSMutableDictionary<NSNumber *, NSMutableArray<id<BHModuleProtocol>> *> *BHModulesByEvent; // evenetKey:Modules
@property(nonatomic, strong) NSMutableDictionary<NSNumber *, NSString *> *BHSelectorByEvent; // eventKey:selector
@end

《1》 BeeHive 动态连接注册

将定义在data字段里面的字符串来获取出来,然后注册模块和服务
每个都要进行动态注册: 这个过程必然会比较慢

NSArray<NSString *>* BHReadConfiguration(char *sectionName,const struct mach_header *mhp);
static void dyld_callback(const struct mach_header *mhp, intptr_t vmaddr_slide)
{
// 读取 模块的数据, 然后进行注册
    NSArray *mods = BHReadConfiguration(BeehiveModSectName, mhp); // 读取mod的配置内容
    for (NSString *modName in mods) {
        Class cls;
        if (modName) {
            cls = NSClassFromString(modName);
            
            if (cls) {
                [[BHModuleManager sharedManager] registerDynamicModule:cls]; // 注册动态的mod
            }
        }
    }
    
    //读取服务数据,进行注册
    NSArray<NSString *> *services = BHReadConfiguration(BeehiveServiceSectName,mhp); // 读取动态的service的内容,动态的方式加载,动态加载的时候就处理了
    for (NSString *map in services) {
        NSData *jsonData =  [map dataUsingEncoding:NSUTF8StringEncoding];
        NSError *error = nil;
        id json = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
        if (!error) {
            if ([json isKindOfClass:[NSDictionary class]] && [json allKeys].count) {
                
                NSString *protocol = [json allKeys][0];
                NSString *clsName  = [json allValues][0];
                
                if (protocol && clsName) {
                    // 注册service
                    [[BHServiceManager sharedManager] registerService:NSProtocolFromString(protocol) implClass:NSClassFromString(clsName)];
                }
                
            }
        }
    }
    
}
__attribute__((constructor)) // 构建的时候就启动这个方法
void initProphet() {
    _dyld_register_func_for_add_image(dyld_callback); // 注册了动态链接
}

// 读取数据段的数据方法
NSArray<NSString *>* BHReadConfiguration(char *sectionName,const struct mach_header *mhp)
{
    NSMutableArray *configs = [NSMutableArray array];
    unsigned long size = 0;
#ifndef __LP64__
    uintptr_t *memory = (uintptr_t*)getsectiondata(mhp, SEG_DATA, sectionName, &size);
#else
    const struct mach_header_64 *mhp64 = (const struct mach_header_64 *)mhp;
    uintptr_t *memory = (uintptr_t*)getsectiondata(mhp64, SEG_DATA, sectionName, &size);
#endif
    
    unsigned long counter = size/sizeof(void*);
    for(int idx = 0; idx < counter; ++idx){
        char *string = (char*)memory[idx];
        NSString *str = [NSString stringWithUTF8String:string];
        if(!str)continue;
        
        BHLog(@"config = %@", str);
        if(str) [configs addObject:str];
    }
    
    return configs;
}

BeeHive 静态注册

性能上面: 总体加载一起注册(相对快点)

BeeHive 静态注册过程

《3》BeeHive 代码动态注册

直接调用动态注册的方法

《4》BeeHive 懒加静态载注册

也是通过plist文件, 文件进行注册(目前是启动8s之后加载 这个信息、或者在使用到的时候再注册)

《5》 根据制定规则注册服务 (懒加载动态注册)【当然,模块也是可以处理的】

在上面没有获取到服务的时候, 根据规则来做最后的查看有没有


获取服务

- (id)createService:(Protocol *)service withServiceName:(NSString *)serviceName shouldCache:(BOOL)shouldCache {
    if (!serviceName.length) {
        serviceName = NSStringFromProtocol(service);
    }
    id implInstance = nil;
    
    if (![self checkValidService:service]) { // 可以忽略
        if (self.enableException) {
            @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:[NSString stringWithFormat:@"%@ protocol does not been registed", NSStringFromProtocol(service)] userInfo:nil];
        }
    }
    
//0) 判断缓存里面这个实现 (缓存的单例)
    NSString *serviceStr = serviceName; 
    if (shouldCache) {
        id protocolImpl = [[BHContext shareInstance] getServiceInstanceFromServiceName:serviceStr];
        if (protocolImpl) {
            return protocolImpl;
        }
    }

   // 1)是否已经注册过
    Class implClass = [self serviceImplClass:service]; =
    
    {
// 2) 这个服务类是否存在
        if (!implClass) { 
      // 2.1) 静态懒加载
            implClass = [[BHLazyManager sharedManager] getIMPWithService:service serviceName:serviceName]; // 
         
            if (!implClass) {  
// 2.2) 查看服务的模块是否存在,如果没有先注册模块(因为很多时候都是在模块里面注册服务的)
                Class moduleClass = [[BHModuleManager sharedManager] findDyanmicModuleWithServiceName:serviceStr];
                if (moduleClass) {
                    BOOL hasModuleRegister =  [[BHModuleManager sharedManager] hasRegisterClass:moduleClass]; 
                    if (!hasModuleRegister) {
                        [[BHModuleManager sharedManager] registerDynamicModule:moduleClass shouldTriggerInitEvent:YES];
                    }
                }
                
// 2.3) 判断服务是否已经注册了,没有就注册服务
                implClass = [self serviceImplClass:service];
                if (!implClass) {
                    implClass = [self findDyanmicIMPWithServiceName:serviceStr];
                    if (implClass) {
                        [self registerService:service implClass:implClass];
                    }
                }
            }
        }
    }
    
// 3) 获取对应的服务实现对象
// 3.1) 判断是否是单例以及是否实现了单例, 单例对象精心了缓存
    if ([[implClass class] respondsToSelector:@selector(singleton)]) {
        if ([[implClass class] singleton]) {
            if ([[implClass class] respondsToSelector:@selector(shareInstance)])
                implInstance = [[implClass class] shareInstance];
            else
                implInstance = [[implClass alloc] init];
            if (shouldCache) {
                [[BHContext shareInstance] addServiceWithImplInstance:implInstance serviceName:serviceStr];
                return implInstance;
            } else {
                return implInstance;
            }
        }
    }

// 3.2) 直接创建对象
    return [[implClass alloc] init];
}

PS:
1)BeeHive基于protocol进行注册使用
2)使用了控制反转的思想来创建对象
3)加载plist信息, 通过反射获取对应类以及创建对象。
4)BHRouter 路由,很多都有路由,感觉这个路由太过于繁琐。


[[self class] shareInstance].serviceName和[BHContext shareInstance].serviceName 是有区别的, 编译器编译会给前面的报错


变成思想

IoC 和DI
什么是AOP
IOC、DI和AOP 几个概念的理解
AOP 核心关注点、横切关注点
spring的框架思想和方式: 控制反转 、依赖注入 (DI)及面向切面编程 (AOP) 。

https://www.jianshu.com/p/2efb2d1cbbc8
反射机制: 通过类对象来创建对象, 而不是直接创建对象
Java 反射是可以让我们在运行时获取类的方法、属性、父类、接口等类的内部信息的机制。也就是说,反射本质上是一个“反着来”的过程。我们通过new创建一个类的实例时,实际上是由Java虚拟机根据这个类的Class对象在运行时构建出来的,而反射是通过一个类的Class对象来获取它的定义信息,从而我们可以访问到它的属性、方法,知道这个类的父类、实现了哪些接口等信息。

相关文章

  • BeeHive 源码

    XNBeeHive 修改之后的源码[https://github.com/bruscarorganization/...

  • BeeHive源码简要解析

    1. iOS 组件化实现的一种思路:面向协议编程 先注册一对一对的协议和相应实现类,在需要时依据协议获取服务实例。...

  • 阿里BeeHive源码小读

    本文是一篇个人学习笔记,记录以供后续学习参考。 一、项目思路 引用Github中 原文: BeeHive是用于iO...

  • kubeedge-beehive源码解析

    个人认为beehive是kubeedge的通讯的核心模块,将beehive看明白基本上就理解一半hubeedge的...

  • iOS 模块化编程框架 BeeHive

    github下载地址:https://github.com/alibaba/BeeHive BeeHive 详细介...

  • BeeHive

    前言 BeeHive 是阿里用于iOS的 App 模块化编程的框架实现方案,吸收了 Spring 框架 Servi...

  • iOS组件化 文章

    iOS组件化 BeeHive iOS应用架构谈 组件化方案 Small iOS BeeHive —— 一个优雅但还...

  • 阿里组件化框架BeeHive解析

    更好的阅读体验,请到个人博客阅读: 阿里组件化框架BeeHive解析 本文是基于BeeHive版本1.6.0进行...

  • BeeHive组件化

    理解关于Beehive的设计思想 Beehive的使用, 可以分3个核心的内容1.Service 服务2.Modu...

  • BeeHive - iOS模块化之路

    1、为什么要使用BeeHive模块化 BeeHive是基于Java的Spring框架,一个分发App状态和统一Se...

网友评论

      本文标题:BeeHive 源码

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