家外必会的工具裤汁!
粉丝4.1万获赞7.3万


某团二面面试官问, spring the attoyer 的 底层怎么实现的?我自信满满,反射啊,扫描注解,然后依赖注入。面试官点点头,又问,那 at override 也是反射实现的吗?我脱口而出,是啊,注解都是反射处理的。面试官笑了,你确定? 我一愣,心里咯噔一下,但还是硬着头皮说,应该是吧。面试官直接摇头。 java 注解有三个生命周期, source class runtime, 只有 runtime 级别的才能被反射读取。 at override 是 source 级别,翻译完就没了,怎么可能用反射,这是基础知识,回去等通知吧。当场懵了,出来查资料才发现, at override 翻译器检查完就扔了,根本活不到运行时, 我把所有注解都当成一回事了。大意了,今天把注解的三个生命周期讲透,这个坑太多人踩了。首先一句话,定性注解就是个标签,一个原数据, 它本身不执行任何逻辑,不改变业务代码,就像在内方法字段上贴个小纸条,告诉翻译器框架或运行时。 这里有点特别注意。处理一下注解的关键在于它的生命周期,也就是 atretention 保留策略。这个决定了注解能活到哪个阶段,谁能看到它怎么处理。它一共三个级别,第一个 source 级别只在原码阶段存在, at override 就是 这个级别, 它的作用是让编辑器检查你有没有真的覆盖附类方法,写错了立刻报错。编辑完之后,这个注解就被扔掉了。字解码文件里压根儿没有,运行时当然拿不到,反射也读不到。 所以 at override 不是 靠反射,是靠编辑器。第二个 class 级别会写近字解码文件,但运行时不加载。 jet brings, the at not know 就是 这个级别, 编辑器会把它写进 class 文件,但 jvm 运行的时候不会加载它。这个级别的注解主要是给自解码分析工具用的,比如 lamback, a, s, m 这些框架,它们在编辑后运行前处理自解码, 这时候能读到这些注解,反射依然拿不到,因为 jvm 没加载。第三个 runtime 级别,一直活到运行时。 spring a toothed, ad transactional, 这些都是 run time 级别。 spring 容器启动的时候会用反射扫描所有类,读取这些注解,然后根据注解的值做对应的处理。比如 a toothed 有 个 required 的 属性, spring 会反射读取这个值,判断是 true 还是 false, 决定找不到病的时候是报错还是忽略。这就是为什么有的注解编辑器有效,有的注解框架有效,不是注解本身的区别是它们的 attention 级别不同。注解怎么定义?用 a tinder face 关键字 就跟定义接口差不多,但前面加个 at, 然后用 attention 指定生命周期用 at target 指定能贴在哪?比如定义一个运行时注解,这个注解只能贴在方法上,运行时有效,有个 value 属性,可以传参数。注解怎么起作用靠处理器 注解本身是不干活儿的,它就是个标记,真正干活儿的是编程器。字解码工具或者运行时框架。 source 级别的注解,编解器提取后做检查。 class 级别的注解字解码工具,提取后生成代码,或做增强。 runtime 级别的注解 框架,用反射读取后执行业务逻辑,比如 spring 处理 a to wire 的 逻辑看到没有?注解本身不干活,是 spring 的 代码在干活,注解只是个标记,告诉 spring 这个字段需要注入。这里顺便说一下原注解, 你会发现注解上还有注解,比如 atretention, at target, 这些就是原注解,也就是注解的注解。常用的原注解有四个, atretention 保留策略 决定注解的生命周期。 source class 还是 run time? at target 目标位置决定注解能贴在哪儿类上,方法上,字段上,参数上等等。 at documented 这个注解会不会出现在 java doc 里? at inherited 子类会不会继承父类的这个注解?记住一个判断标准,看注解能不能被反射读到,关键就看 attention 是 不是 run time, 不是 run time 的 反射。拿不到面试怎么答?面试官问 driver 注解的原理,你得这么说, 注解的本质是一种原数据标记,它本身不影响代码逻辑,而是通过 attention 保留策略控制生命周期。 source 级别的注解在编辑阶段生效,给编辑器做检查,编后就丢了。比如 at override class 级别的注解会写进字解码,但运行时不加载 给字解码工具用。比如 longback, run time 级别的注解会一直保留到运行时框架,通过反射读取它的值,然后执行对应逻辑。比如 spring the totaled 注解本身不干活,干活的是处理器变易器字解码工具,运行时框架根据注解的标记去执行不同的处理逻辑。 如果能举个例子,比如说 at override 是 翻译时检查,不是反射, a totaled 才是运行时反射。面试官会觉得你真的理解了。总结一下,记住三点, 第一,注解是标记,不是逻辑,它不执行代码。第二, attention 决定生命周期, source 给翻译器, class 给自检码工具, runtime 给框架。第三,只有 runtime 级别的注解才能被反射读取。我那次面试虽然挂了,但让我彻底搞懂了注解的原理。 现在我面试别人也会问这个问题,能答清楚的我少踩坑。

大家好,我是 map, 今天三分钟带你快速了解蓝群否 j。 先回答一个问题,它是什么?蓝群否 j 是 一个开源的加瓦库,帮助你把大元模型人力无痛地集成到加瓦应用中, 不统一 python 或 js 那 些生态 java 也有自己的代元模型框架了,而且非常实用。它的目标非常明确,就是让 java 开发者轻松地接入代元模型,不用重复写各种 api 适配代码。那它解决了什么问题呢? 在现实当中,带大模型和限量数据库都是各家不同的一个 api, 比如说 open api 啊, dapic 等等,那每一个都有自己的 sdk 和调用方式。这就导致了两个痛点,一,你要为每一个模型、每个存储 都写适配的代码。第二,先切换模型或存储时都要重写逻辑。那蓝群佛祖的价值就来了,它提供三大核心能力, 第一,统一 api。 无论你用什么大元模型或限量数据库,蓝群佛瑞都给你一套统一的接口,先换模型代码不动,只换配置就可以了。 蓝群佛瑞它目前支持二十多种主流的大元模型的供应商,以及支持三十多种 线面存储,覆盖度已经非常的高。第二,大核心能力是全面的工具,先从底层的 prompt 模板、聊天记忆函数调用到高阶的 i a g, 也就是解锁真浅,深层以及 agent 机制都有。不管你是做聊天机器人智能问答,还是构建一条从数据接入到语域简所在深层的完整流水线,通通都有现成主键可用。第三,大核心能力,丰富的视力已快速上手。 呃,它开先即用的例子展示了各种大元模型的应用场景,那你可以立即开始构建应用,不需要从空空白开始搜索 它的来源和社区定位呢?蓝群所为现目前从二零二三年初就开始了,在 tw 的 gbt 的 热潮当中诞生,是为了补齐 java 生态在大元模型领域的一个空白。名字里面有蓝群, 其实它融合了篮群,还有篮群 ingest 以及社区其他优秀的闲访,同时加入自己的一些创新,那团队持续地在跟进新的技术趋势和集成,确保你不会用过死的一些功能。 最后我们一句话总结,篮群否队不是简单地调用模型的 sdk, 它是一套工程级的代言模型框架,结构化统一,可组合,可维护,让 java 应用 真正拥有智人的人力。好了,以上就是我们今天所有的内容,下期继续聊 ai 硬核知识。

今天我们来聊聊微服务架构中的重要组建 nas, 两分钟内我会告诉你 nas 它是什么,它与 eureka 的 区别,以及它的一个核心原理。在这里,我花了八个月整理了一百万字的高平面视文档,把高平面视题、技术场景题都按照场景分析技术原理准备思路、标准回答做了整理。需要突击面试的朋友评论区扣六六六,这份资料能办, 让你少走百分之八十的弯路。 nikos 呢?它是阿里巴巴开源的一站式微服务解决方案,它的名字源自 naming and configuration service 的 缩写。简单来说, nikos 做两件核心的事情,服 务注册与发现。帮助微服务互相找到对方。配置管理,集中管理各个服务的一个配置信息,并且支持动态更新。 nikos 经过阿里多年双十一的考验,能 支持百万级的服务规模,拥有高性能、高可用的特点。 nikos 和 uric 卡都是服务注册中心,但有几个关键的区别,功能范围, uric 卡只提供服务注册发现,而 nikos 还提供配置中心功能。以 智性模型层面,由瑞卡采用 a p 模型,保证高可用性,但可能会出现数据不一致。 nasa 呢,则采用 a p 和 c p 两种模式切换。临时实力使用 a p 模式,持久实力使用 c p 模式。健康检查层面,由瑞卡依赖客户端的心跳。 nasa 不 仅支持客户端心跳,还支持主动去探测服务健康状态。在界面友好性方面, nasa 提供更丰富、更医用的一个控制台界面。 nasa 的 核心原理围绕两个关键机制服务到 nasa 服务服务 器 nux 维护服务列表,并使用心跳机制检测服务状态。客户端从 nux 获取可用服务列表,实现服务调用。配置管理层面,配置集中存储在 nux 中,采用长轮询机制,当配置变更时,快速去通知所有订阅该配置的一个服务。 客户端去接收变更通知后,自动去刷新应用配置,无需重启。另外,如果近期面试受阻,没有面试机会,我们也有面试突击陪跑服务,可以私我咨询。从简历优化、项目包装技术突击、面试、突击、项目业务难点亮点梳理、模拟面试、面试复盘并向内推等。

为什么那么多人觉得软件开发很难?为什么你努力工作了好几年,开发技术始终没有大的提升? 如果你是一个内心骄傲的人,并且觉得自己的技术很强,请你划走这条视频。如果你是应届生或者是刚入行的新手,那么下面的内容啊,对你非常重要。 这些内容呢,都是我多年经验总结的在开发工作中最常用的基础知识,这些知识所构成的知识体系, 将会对你的技术提升起到决定性的支撑作用。缺少任何一方面,都会在实际工作中带来无数的麻烦。第一个方面呢,就是面向对象开发的基础, 包括类和对象的关系,类的特性等。第二个方面呢,就是网络基础,包括 dns、 内网 ip、 外网 ip、 域名和端口, http 和 https 等等。第三个方面呢,就是计算机原理和操作系统,包括内存、硬盘、 cpu、 呃雷尼克斯、基本命令现成和进程。第四个方面呢,就是数据库基础, 包括数据库的锁引,锁引的原则,锁引失效的几种情况,主从库慢查询。第五个方面呢,就是开发相关的基础,包括开发的基本框架, cok 和筛审, get 请求和 pos 的请求。 以上这些基础知识点,我整理了一份学习提纲,有需要的同学可以到视频下方的小黄车领取。

呃, ok, 紧接着呢,咱们来看这样一道面试题,来自于阿里的肯坎特哈西麦普的散列算法。呃,这个面试题呢,一般对标的薪资是十五到三十 k 左右,岗位呢也是中高级开发公司。 那先说一下,其实这个散列算法呢,在咱们的哈西麦普里面也有,但是啊,肯坎特哈西麦普的散列算法呢,略有那么一捏捏的不同,它额外做了一些操作。 那这个问题其实也可以换一个问法,就比如说为什么这个肯坎达哈西麦克的速度长度始终是二点四方啊,也是在问这个散列算法的一些细节,就这块更多的咱们要对原码有一个掌握。来到咱们的笔记者可以往下面去翻找到咱们在存储操作时有一个散列算法。 那首先咱们还要再清楚一个概念,当我向咱们的 canker 的 哈希 map 写入一个数据的时候,它会根据 key 的 哈希 code 来决定我当前数据要放在数值的哪一个,所以位置上,那它具体的运算呢,是在这个位置做的, 他会根据 key 的 哈希扣的算出一个哈希值,但是呢,一定要看清楚,他已经调用了 key 点哈希扣的。紧接着呢是执行了一个叫做 spring 的 方法,那咱们要看一下这个 spring 的 方法做了一个什么事来看,这 这边传入的 h 本身就已经是 key 的 哈希扣的了,不过呢,他还将 key 的 哈希扣的哎 高低十六位进行了一个异国预算,你会发现这他把哈西扣的向右移了十六位,那就相当于这边是十六位,这边十六位移完之后呢,把高位的啊,这种我写个 h 吧,这种高位的就是低位的,他把高位的移到了,哎,低位的位置, 然后呢,再用这两个数据进行一个异或预算,那么这样的话,你会发现一个特点,高位的数据和低位做了一波异或预算。哎,那这么做的原因是什么呢?其实原因很简单, 因为在我得到了一个基于 spring 的 计算出来的哈希值之后,我要基于这个哈希值去计算我的数据要放在数组的哪个缩影位置上,这边可以看到 n 是 数组的长度, 哈希就是我 key 的 哈希扣子做了高低位异或计算之后得到的结果。那么 n 减一,数值长度减一,和咱们的哈希值进行一个与运算之后,我得到的就是我数据要存储的位置,但是咱们一般情况下数值的长度没有那么长, 哎,可能呢,默认值是十六,他的就是零零,这是零一二四 零啊,这一二四八十六可能就是一个这样的值,减完之后它就是四个零啊。然后呢,我的整个哈西值可是一共有三十二位的,但是我只有第四位参与到了整个预算中。如果我直接用哈西扣的去确定这个值的话,你会发现, 能够决定我数据存放在哪个位置的,只有我 key 的 哈西扣的的低四位可以决定,但是高级位都没有参与到。但是经过这种运算之后,你会发现 啊,经过这种运算之后,他的高位或者高十六位中的低四位也会参与到运算当中,而这边也是他运算的一个过程,都在这。 好,那么这样的话咱们可以清楚了,目的很简单,之前用传统的哈西扣的做计算存储的位置时, 因为我的数组长度没那么长,所以说只有低位会参与到预算,在经过这样的一个散略算法的预算之后,哎,我高位里面也会适当的参与到咱们的预算中,这样的话,可以尽量的去打散我的数据,尽可能的平均的数值上 好,这块比较 ok。 那 数组长度减一这点要清楚,因为呢,咱们在做语韵算的时候都为一才为一,所以说这就到了另外一种问法了, 为什么数组长度必须是二的 n 次方?原因就在这,如果说你的数组长度是十七,那你可能是幺零零零幺,对吧?那这样的话,你会发现,当我对它减一之后,我是一个这样的值, 只有这个位置的数据才会参与到我计算所有的位置上,那要么放这,要么放零号位置,那 这样的话,哈希冲突就会变多。所以说为了尽可能的打伞,咱们哈希 map 或者 concur 哈希 map 中数字长度必须是二乘以次方,这是没有任何商量的,哪怕你给个十五,他也帮你转成十六,你给个十七,他帮你转成三十二,都是一样的套路。好,那么除此之外的话呢,还有一块,你会发现 他额外做了一个操作,将高低位运算的值与上了一个哈西比特斯。那什么是哈西比特斯呢?其实这个哈西比特斯就是 int 者的最大取值范围,就是低位是零,后面全是一啊,全是一。那这种运算的话,你会发现它并没有实际的对这个数据做什么改变,唯一可能有变化就是它的最高位一定是零, 而最高位是零的目的是为了保证咱们计算出来的这个哈希值,他一定是一个正数啊,一定是一个正数,因为最高位的符号位一定是零吗?低位的值是没有变化的一个匀算。 那为什么必须是正数呢?原因很简单,因为在咱们整个哈希,或者说咱们的肯卡隆的哈希 map 里面,很多位置都会基于咱们的哈希值做一些判断。如果你的哈希值是小于零的,它有一些特殊情况, 比如你的哈你这个,呃,你这个 key 的 哈希值是负一,那代表我当前数值的这个位置啊,它已经迁移到了新数值中,也就是说整个肯卡隆哈希 map 正在做扩容操作。 另外一个情况,如果说你的哈希值是负二,那代表我当前数组下挂的并不是一个链表,而是一棵红黑树 啊,红黑树还有一个呢,叫做 r e s e r v d 啊,这个东西呢,是提前占用了这个位置,它是用了什么呢?咱们的函数式编程,我直接把这个坑先占住,但是我的结果需要通过计算才能得出来,那么这个时候你当前位置的值就是一个负三, 所以说负数是有一些特殊含义的,为了避免我通过这种方式计算出来的值是一个负数,所以说我要做一个这样的语韵算,保证我得到的哈希值的最高位符号位一定是零,从而确保它一定是一个正数。 那这是咱们关于 concur 的 哈希 map 的 散列算法,一共两点,第一点是为了让我的 key 的 哈希扣的高位和低位都可以参与到计算所隐位置的运算当中。 另外一个,这个语运算的目的是为了保证咱们计算出来的哈希扣的一定是正数,避免出现负数,因为负数在 concur 的 哈希 map 中有一些特殊的表示。


入行,那么根据刚才这个方案, java 加 python, 也就是大模型啊, 然后或者是 c c p p 加 python 大 模型,根据刚才这个方案呢,你入行有三个点可以入,认真听我说,入行你有三个点可以入,那第一个呢?就是直接用大模型入行, 或者是用 java 直接入行后端,或者是用 c c 加加啊,做服务器编程,网络编程,或者是切入式来入行。 当然还有一种组合式的入行,就是我时间很充裕,我现在今年才大一大二,然后 认可了马老师的这个学学习理念啊,跟着我们学习,我用了两三年的时间,我其实完全可以把这两个一块学下来,或者把这两个一块学下来,听懂了吗?也就是组合式入行, 单选 java, 或者单选 c i 加,或者单选大模型,或者选 java 加大模型,或者选 c c i 加大模型,对吧?组合式入行,这个都可以, 但是没有 java 加 c 加加这种方式啊。选,注意啊,主流语言选一个就行,不要选那么多,选那么多你也学习不过来。所以入行的方式有这几个,如果你能想更从容的入行,肯定是组合式入行会更好。那么有的同学可能会说,老师,我时间是不够, 我原来呢,不会 java, 也不会 c i 加,我编程的语言可能就会点基本的 c 啊,可能会点勾浪等等,会会点 p h p, 我 想专攻大模型行不行?可以的,没有没有问题,这个入行我刚才讲过了,它的弊端在于 相对简单,很多企业会纳过这个闷来啊,然后很多人往里钻呢。这个,呃,很快,这个赛道呢,会会会比较卷,所以如果你想入要抓紧, 而且我刚才说了三个月业余时间就能达到入行的要求,还不用三个月的那种,那种专门的这个这个这个全身心的投入的学习,能能理解吗?业余时间就够就能达到入行的要求,但是弊端在于 整体的岗位偏少,尤其是对于应届生来说。那应届生大模型这个入行呢?有有谁呢?可能就专门学 ai 的, 然后呢?呃,专门学数学的啊,学生物的啊,学这个这个计算机的啊等等, 有这方面的机会才,那对于其他想转行了,这个基本上概率就很低了,就算是你原来是这个行业的,整体的岗位依然偏少啊,我不知道讲清楚没有啊, 但是还是挺热还是挺热啊?可以考虑这个没问题,这是效率最就是时间效率最高的啊,时间最短的时间最短,你要用这个入行或用这个入行, 这个需要花的时间肯定要大于三个月业余时间,这是时间最短的,当然他的概率也没那么高,同时呢他的发展性也没那么好, 因为将来我们要考虑长远发展的时候,对于我们普通人来说,你做不了那个核心算法工程师团队里面的那个核心的算法工程师,那么你的将来的发展大概率要走向架构师,那对架构师来说业务是核心,怎么解决业务往往后端 才是最主要的理解模型,理解后端,同时呢加入大模型的这种工具。 所以对于长远你要奔这个目标去,你就尽量的以这个方向来入行,或者你快速入了行之后呢,把这个给加上,或者你快速入了行之后,把这个给加上, 这个我讲清楚没有?那有同学说了,我到底需要达到什么样的要求啊?因为刚才问问题里头谈谈到了最低要求,这个最低要求啊,建议大家找我们的大纲拿过来,这个最主要是项目经验, 这个最主要是项目经验,目前在咱们课程体系里头呢,为大家提供了八个项目, 最新今年新加的项目,十六号开始的,大家如果来得及还可以跟得上的啊,刚讲了第一次课,完全没问题。这里面最主要的是项目经验,就是你要有相关项目经验,因为你看这个大模型应用开发入行的时候, 大多数要求的是有相关项目经验的,优先听懂没?所以这个呢是要求项目经验的 那招后端的入行呢?如果你是最低要求说,我就找一个外包这一类的分布式微服务的基本项目就可以。那 c 和 c 加入行的要求呢?如果你找的是那个最低的要求,就看你,因为 c 和 c 加你要选方向啊,这个方向不同,难度不同, 它这个 java 其实就这一条路,你没得选,你就只能往后端杀啊,其他的基本上什么做什么应用开发了,做什么客户端了,这个它都不支持, 所以它学起来呢,看上去难,但实际上也相对简单,因为它方向就这一个,你只要攻这一个方向就可以了。但是 c 和 c i 加不一样,真正就业的时候,你入行的时候你还要选细分方向,而且每换一个细分方向差差不多,就类似于像换了另外一条路一样, 也就是说你还要选择我到底是做 linux 服务器开发,我是做 qt 开发,是做嵌入式开发,还是要做什么音视频开发,还是要做什么底层开发? 做什么?这个这个,呃,这个,这个优化的并发的开发啊,云服务相关的开发等等,就是每一个不同的方向呢,就像换一条不同的路一样。 所以这个呢,根据你选的细分方向啊,然后再来定这个。还是那句话,如果大家想透彻理解,大家一定要找咱们小姐姐,要咱们各个方向的大纲, 选 c, c 加加的,找咱们要 c 加加大纲,选 java 的 要 java 大 纲,选大模型的要大模型大纲。把大纲要下来,仔仔细细,从头读到尾,你就理解了知识的脉络, 你就知道哦,我需要沿着什么样的脉络走,学到这里的时候,大概能听懂的老师扣一啊。