前言 AI Agent 正在成为软件架构的重要组件。但如何让 Agent 能够被远程访问,是一个容易被低估的技术决策。 不同的协议选择,会直接影响: 用户体验:延迟、流畅度 开发成本:实现难度、调试复杂度 运维成本:资源占用、可扩展性 应用场景:能做什么、不能做什么 本文从技术角度深度分析几种主流协议,帮助你做出最佳选择。 协议全景图 ┌─────────────┬──────────────┬──────────────┬─────────────┐ │ 协议 │ 连接类型 │ 通信模式 │ 适用场景 │ ├─────────────┼──────────────┼──────────────┼─────────────┤ │ HTTP/REST │ 短连接 │ 请求-响应 │ API 服务 │ │ WebSocket │ 长连接 │ 全双工 │ 实时交互 │ │ SSE │ 长连接 │ 单向推送 │ 流式输出 │ │ gRPC │ 长连接 │ 全双工 │ 内部服务 │ │ SSH │ 长连接 │ 终端交互 │ CLI 工具 │ └─────────────┴──────────────┴──────────────┴─────────────┘ 一、HTTP/HTTPS + RESTful API 1.1 工作原理 最传统的方式。客户端发送 HTTP 请求,服务器返回 Agent 的响应。 ...
DeepSeek V4 的选择:当AI模型站队中国芯片
前言 2026年2月25日,路透社的一则报道在科技圈炸开了锅: DeepSeek 发布 V4 之前,打破行业惯例,没有向英伟达和 AMD 提供早期访问权限,而是让华为等中国芯片厂商提前数周开展适配工作。 这条新闻的分量,不在于技术突破,而在于选择的姿态。 打破的惯例 AI 行业有一条不成文的规则:模型厂商会优先与英伟达合作,确保新模型在主流硬件上高效运行。这不是商业偏好,而是生存本能——英伟达占据了 AI 芯片市场 80% 以上的份额,你的模型如果不能在 CUDA 上跑得好,基本等于废了一半。 DeepSeek 之前也是这么做的。它的 V3、R1 等模型都与英伟达工程师紧密合作,确保在 H100、H800 上有最佳性能。 但这次不一样。 V4 发布之前,DeepSeek 没有联系英伟达和 AMD,而是让华为等中国芯片厂商提前几周拿到模型进行适配。这是对行业惯例的公然违背。 英伟达和 AMD 拒绝置评。DeepSeek 和华为未予回应。 沉默本身,就是一种态度。 选择的背景 这不是一个孤立的技术决策。理解这个选择,需要看更大的背景。 美国芯片出口管制的困局 2025年12月,特朗普政府宣布允许英伟达向中国出口 H200 芯片,但有附加条件: 保障美国"国家安全" 美国政府获得25%的分成 消息一出,英伟达要求供应链增产 H200,预判中国需求旺盛。 然而两个月过去了,H200 对华销售数量为零。 美国商务部官员在国会听证会上承认:“据我了解,截至目前,数量为零。” 原因很简单:国务院坚持更严格的限制,许可证审批陷入僵局。英伟达方面"十分沮丧",有知情人士直言"国务院把事情变得非常困难"。 中国客户的观望 在许可条件不明朗的情况下,中国客户没有向英伟达下达订单。部分供应商已暂停生产 H200 的关键组件。 这不是短期的波动,而是供应链重构的开始。 当未来充满不确定性,企业会本能地寻找替代方案。华为昇腾、寒武纪、摩尔线程——这些曾经被视为"备胎"的国产芯片,正在从边缘走向中心。 DeepSeek 的考量 DeepSeek 为什么做出这个选择? 1. 用户在哪里,适配就优先到哪里 DeepSeek 在 Hugging Face 上的模型下载量已超过 7500 万次,中国是重要市场。如果 V4 发布时,华为昇腾芯片的用户能获得更好的性能体验,这对 DeepSeek 的生态建设是利好。 ...
魅族之死:技术情怀的终局
前言 2026年3月,魅族手机正式退市。 这条新闻没有掀起太大波澜——一个边缘厂商的消亡,早已是预期之内的事。但对于经历过那个时代的人来说,这个句号画得有些沉重。 从MP3到智能手机的浪漫 魅族的故事始于2003年。那时候它做MP3播放器,是国内市场的龙头之一。创始人黄章是个产品偏执狂,对细节有近乎病态的苛求——这种气质后来也延续到了手机上。 2009年,M8发布。它是国内第一部真正意义上的智能手机,比小米早了两年。M9更是让魅族一战成名:深度定制的系统、retina屏幕、三星处理器——在那个"中华酷联"还在做运营商定制机的年代,魅族是少数认真做产品的厂商。 它的系统叫Flyme,设计语言是"侘寂"——一种日式美学,追求简约、克制、不完美的美感。这很魅族:小众、文艺、有点自我感动。 魅蓝的误判 2014年,小米和荣耀崛起。魅族被逼到了墙角。 时任高级副总裁的李楠推动成立了子品牌"魅蓝",定位"青年良品",主打性价比。2015年,魅族销量突破2000万台,其中魅蓝占了70%。这是魅族最后的高光时刻。 但魅蓝从未得到内部真正的重视。 2016年,魅族决定放弃销量导向,转向高端市场。它开始学OV——疯狂铺线下渠道,用机海战术覆盖市场,试图用高溢价换取利润。 这个战略彻底失败了。渠道扩张带来了巨额成本,却没有换来相应的销量。与此同时,苹果和"华米OV"的格局日趋稳固,魅族被挤压到了边缘。 李楠后来在知乎上反思:魅蓝本可以成为魅族的红米,但公司选择了另一条路。 吉利的收购:一笔学费 2022年,吉利旗下星纪时代收购魅族79%的股权,组建星纪魅族集团。吉利董事长李书福的算盘很清楚:通过手机业务,加速车机系统的智能化。魅族最值钱的不是手机,而是Flyme。 三年后,这笔交易的结果是:魅族手机累计亏损上百亿,Flyme被并入吉利智驾部门,手机业务正式停摆。 一位魅族员工说:“这算是吉利为智驾交的学费,吉利也觉得这笔学费早就交够了。” 从商业角度,这个结局不难理解。手机行业早已是红海,头部效应明显。魅族没有规模、没有供应链话语权、没有足够的研发投入,维持手机业务纯属烧钱。吉利要的是Flyme,不是又一个亏损的手机品牌。 技术情怀的边界 魅族的故事让我想起很多类似的命运:锤子、金立、360手机、联想手机业务(卖给摩托又买回来)……它们都有过雄心,都有过人才,但最终都败给了同一个东西:规模。 智能手机是一个典型的"赢家通吃"行业。你需要: 每年数千万台的出货量来摊薄研发成本 强大的供应链话语权来压低采购价格 庞大的渠道网络来触达用户 足够的利润来支撑下一轮创新 这些条件缺一不可。而一旦你失去规模,就会陷入恶性循环:销量下降→成本上升→利润下滑→研发投入减少→产品竞争力下降→销量继续下降。 魅族不是输给了情怀,而是输给了行业规律。在手机这个赛道,小而美是活不下去的。 Flyme的遗产 魅族手机死了,但Flyme会活着。 它已经被整合进吉利的智驾体系,继续服务车机市场。这是魅族最有价值的技术资产,也是吉利真正想要的东西。 某种意义上,魅族完成了它的使命:它培养了一支有能力的软件团队,这套能力现在被转移到了汽车行业。从结果来看,这不是一个完全失败的故事——只是手机业务成了代价。 给技术人的启示 魅族的故事对技术人有什么启示? 1. 情怀不能对抗规律 你可以热爱产品、追求极致、坚持审美,但最终要尊重商业规律。市场不会因为你的情怀而网开一面。 2. 选择赛道比努力更重要 手机行业在2016年就已经格局固化。魅族在那之后的所有挣扎,本质上都是在与趋势对抗。如果你的赛道已经是红海,再努力也很难出头。 3. 技术资产的转移是可能的 魅族手机失败了,但Flyme的能力被继承了下来。技术、团队、方法论——这些可以迁移到新的战场。失败的组织,不一定意味着失败的经验。 4. 时机比能力更重要 魅族做智能手机比小米早,但它错过了互联网手机的黄金窗口。小米抓住了2011-2014年的红利期,而魅族在犹豫。同样的能力,不同的时机,结局完全不同。 尾声 魅族曾是中国手机行业的一股清流。它不够圆滑、不够功利、有时候甚至有点轴。这种气质在商业世界里是脆弱的,但它也是真实的。 2026年3月,魅族手机正式退市。 再见,珠海小厂。你的故事结束了,但你留下的东西——那些关于产品、关于设计、关于"小而美"的坚持——会被记住。 在这个赢家通吃的时代,或许每一个小而美的消亡,都值得我们停下来说一声:谢谢你曾经来过。 本文写于2026年2月26日,基于界面新闻、IT之家等媒体报道。
大模型的生存游戏:谁在赚钱,谁在等死?
前言 2026年2月25日,一条新闻在AI圈刷屏: Kimi K2.5 上线不足20天,累计收入已超过2025年全年总和。 同一周,另一个消息鲜有人注意: 智谱AI招股书披露:云端部署业务毛利为零。 两家公司,同一个行业,两种命运。 这不是个案,而是整个大模型行业的缩影——在价格战、开源潮、出海竞争的三重挤压下,有人突围,有人挣扎,有人注定出局。 本文将基于最新的公开数据和报道,深度解构国内外AI大模型厂商的真实生存局面。 一、行业的"烧钱悖论" 1.1 成本结构:为什么赚钱这么难? 大模型的核心成本来自三块: 成本类型 说明 量级 训练成本 一次完整训练的算力消耗 数千万-上亿美元 推理成本 每次API调用的GPU消耗 持续、可变 人力成本 顶尖AI研究人才 百万美元/年/人 以GPT-4为例,业界估计其训练成本约1亿美元。但这只是开始——每次用户提问,OpenAI都要消耗GPU算力。 推理成本的残酷现实: 过去3年,AI推理成本下降了超过99%。 但即便如此,当你的API价格降到OpenAI的1/10时,你可能仍在亏本。 1.2 收入困境:价格战没有赢家 2025年下半年,国内大模型行业进入"自杀式价格战": 阿里云、百度提供免费长文本服务 DeepSeek API价格持续下探 各家Coding Plan套餐定价低于成本 智谱AI的招股书数据很说明问题: 云端部署业务毛利为0——这还是按原价售卖API的情况下。 换句话说,智谱每卖出1元钱的API服务,成本就是1元。不算研发、不算人力,仅算力成本就吃掉了全部收入。 这不是智谱的问题,是整个行业的问题。 二、谁在赚钱?突围者的共同密码 2.1 Kimi的"降维打击" 2026年2月25日,腾讯新闻披露了一组令人咋舌的数据: 月之暗面(Moonshot AI)核心数据: K2.5发布20天,收入超过2025年全年 全球付费用户环比增长4倍 海外收入首次超越国内 估值突破100亿美元,成为国内最快"十角兽" API定价比OpenAI低6-10倍 Kimi做对了什么? 策略一:全面开源 + MIT协议 K2.5采用MIT开源协议,这是最宽松的开源许可——开发者可以商用、可以闭源、几乎没有任何限制。 更重要的是:全面兼容OpenAI API接口。 海外开发者无需重写代码,仅需替换一行URL即可无缝切换。 这种"无感替代"策略,让Kimi在GitHub、Hugging Face等国际社区迅速渗透。 策略二:放弃国内免费流量,专注海外付费市场 2025年,Kimi做了一个当时被质疑的决定: 砍掉Ohai、Noisee等C端泛娱乐产品线,将资源集中于基座模型与Agent研发。 当时国内同行都在做"免费聊天机器人"抢用户,Kimi却选择了另一条路。 事实证明,这个选择是对的: 国内用户习惯了"免费",付费意愿低 海外开发者更愿意为高质量API付费 OpenAI的高定价给竞争对手留出了空间 策略三:技术差异化 ...
AI 编程工具 vs 内部框架:协作而非替代
2025年初,Anthropic 推出了 Claude Code。这不是一个普通的代码补全工具,而是一个代理式(Agentic)编程助手——它能理解整个代码库、执行 bash 命令、查看 Git 历史、运行测试,甚至自主规划多步骤任务。 研究显示,使用它能让开发速度提升 5 倍以上。 很多人开始问一个尖锐的问题:如果 AI 能帮我们写代码,内部编程框架还有必要存在吗? 这篇文章不谈炒作,只回答一个问题:AI 编程工具和内部框架,到底是什么关系? 一、事实:Claude Code 的当前实力 1.1 它能做什么? 根据 Anthropic 官方文档和开发者社区反馈,Claude Code 的核心能力包括: 1. 理解整个代码库 不是局部补全,而是项目级理解 能追踪跨文件的依赖关系 能理解代码的设计意图 2. 代理式工作流 不只是"写代码",而是"完成任务" 你说"帮我构建一个 React 组件",它会: 分析代码结构 生成代码 运行测试 集成到项目中 3. 终端集成 能执行 bash 命令 能查看 Git 历史 能运行测试和构建 4. 上下文记忆 通过 CLAUDE.md 文件记录项目细节 能记住代码风格、常见问题、团队规范 5. Skills 模块(2025年新功能) 可重用的工作流 支持市场共享 可构建自定义代理 1.2 它不能做什么? 1. 不理解业务战略 它能写代码,但不能决定"应该做什么" 2. 不负责长期维护 生成的代码需要人工审查和改进 3. 不知道你的框架规范 ...
从 WordPress 到 Hugo:我的博客迁移全记录
背景 我的博客建于 2014 年,最初使用 WordPress 搭建。十年来,积累了 282 篇文章,涉及技术笔记、产品评测、行业观察等多个类别。 但随着时间推移,WordPress 的问题越来越明显: 性能瓶颈:每次访问都要查询数据库,响应慢,需要缓存插件维持 维护负担:核心、插件、主题需要频繁更新,安全隐患多 资源消耗:PHP + MySQL 的组合对服务器资源要求较高 备份复杂:需要同时备份数据库和文件,恢复流程繁琐 2026 年初,我决定将博客迁移到 Hugo —— 一个基于 Go 语言的静态网站生成器。 迁移完成后,博客的访问速度提升了 5-10 倍,服务器资源占用降低了 90% 以上。 本文记录了整个迁移过程,希望对有类似需求的朋友有所帮助。 一、为什么选择 Hugo? 在决定迁移之前,我对比了几种主流的静态网站生成器: 工具 优点 缺点 Hugo 极快(毫秒级构建)、Go 原生、主题丰富 模板语法需要学习 Jekyll GitHub 原生支持、生态成熟 Ruby 依赖、构建较慢 Hexo 中文社区活跃、上手简单 Node.js 依赖、插件质量参差 Astro 现代化、支持多框架 相对较新、迁移资源少 最终选择 Hugo 的原因: 构建速度:282 篇文章的构建时间不到 5 秒 单文件部署:Hugo 是一个独立二进制文件,无需安装依赖 主题生态:PaperMod、Stack 等主题现代且维护活跃 迁移工具:社区有成熟的 WordPress 转 Hugo 方案 二、迁移方案设计 2.1 迁移流程概览 WordPress (MySQL) ↓ 导出 WXR XML(WordPress 导出工具) ↓ PHP 转换脚本(自定义 wp2hugo.php) ↓ Hugo Markdown 文件 ↓ Hugo 构建 ↓ 静态 HTML(Nginx 托管) 2.2 关键决策 决策一:使用 PHP 转换而非现成工具 ...
OpenAI 踩刹车:AI 狂奔时代的第一道休止符
前言 2026 年 2 月 21 日,一条看似低调的消息在科技圈炸开了锅: OpenAI 将 2030 年算力支出目标从 1.4 万亿美元下调至 6000 亿美元。 降幅 57%。直接腰斩还多。 如果你关注 AI 行业,应该记得几个月前 Altman 还在高调宣称要投资"万亿级基础设施"。当时整个行业都在讨论:算力缺口有多大?GPU 还要涨多少?数据中心建得够不够快? 然后,OpenAI 自己踩了刹车。 这不仅仅是数字的调整,更是整个行业心态转变的信号。 一、发生了什么? 让我们先看看具体数据: 算力支出目标调整 原计划:2030 年投入 1.4 万亿美元(约 9.68 万亿人民币) 调整后:6000 亿美元(约 4.15 万亿人民币) 降幅:57% 估值调整 原估值:8300 亿美元 调整后:7300 亿美元 降幅:12% 财务目标 2030 年营收预期:超 2800 亿美元 2025 年实际收入:131 亿美元(超原目标 100 亿) 2025 年资金消耗:80 亿美元(低于预估 90 亿) 融资情况 新一轮融资规模:超 1000 亿美元 战略投资者占比:90% 主要投资方:软银、英伟达(最多 300 亿)、亚马逊 表面上看,这是 Altman 对此前"激进承诺"的修正。但更深层的问题是:为什么需要修正?谁在推动修正? ...
华为Mate80央视直播:一场技术与舆论的双重战役
背景 2025年11月25日,华为正式发布了Mate80系列手机。这场发布会选择在央视直播,这一决策本身就值得玩味。作为中国科技企业的代表,华为的每一次大动作都不再仅仅是商业行为,而是承载了更多的象征意义。 Mate80系列概览 根据公开信息,Mate80系列共推出四款机型: Mate80 标准版 - 入门旗舰定位 Mate80 Pro - 主力高端机型 Mate80 Pro Max - 大屏旗舰 Mate80 非凡大师版 - 顶配奢华定位 全系搭载纯血鸿蒙系统(HarmonyOS),这意味着华为彻底切断了与安卓生态的依赖关系。 央视直播的战略考量 为什么是央视? 一家商业公司的产品发布会登上国家级媒体平台,这在中国科技史上并不常见。华为此举至少有三层考量: 政治背书 - 在中美科技博弈的背景下,央视直播本身就是一种态度表态 市场覆盖 - 央视的受众远超科技圈,有助于触达更广泛的消费群体 品牌塑造 - 将产品发布上升为"国家大事"级别,强化民族品牌形象 利弊分析 优势: 极大提升品牌公信力 获得主流舆论支持 在下沉市场建立认知优势 风险: 过度绑定可能导致国际市场顾虑加深 商业行为政治化可能引发部分消费者反感 央视受众与高端手机目标用户存在错位 纯血鸿蒙:技术自主的最后拼图 Mate80系列最大的技术亮点不是硬件,而是全系预装纯血鸿蒙系统。 技术层面的挑战 纯血鸿蒙意味着: 应用生态重构 - 开发者需要适配全新系统 兼容性阵痛 - 早期用户体验可能面临应用缺失 性能优化 - 新系统需要时间打磨 根据华为官方数据,鸿蒙生态已有超过10万个原生应用。但与安卓、iOS数百万级别的生态相比,差距依然明显。 自主可控的代价 技术自主从来不是免费的午餐。华为在芯片、操作系统、应用生态三个层面同时推进自主化,这种"全栈自研"策略在全球科技企业中极为罕见。 其代价是: 研发成本激增 - 每年千亿级别的投入 生态建设周期长 - 至少需要3-5年才能成熟 用户体验阵痛 - 早期用户承担了生态建设的成本 客观评价 产品力 从已知参数来看,Mate80系列在硬件层面依然是第一梯队: ...
豆包AI编程初体验,惊人的生产力工具
假期有闲暇学习一下AI相关的知识,尝试着想用公众号对接DeepSeek做一个问答,当做一个BlogAgent,又不想写太多的工程类的代码,想着AI这么强大,能不能直接用AI生成代码。没有看阿里,百度的产品,直接试用了豆包的AI编程,通过这两天的试用,AI惊人的生产力着实让我惊掉下巴。 一、项目级代码生成 我一开始描述,要求 实现一个微信公众号的后台服务代码,可以接收用户信息,并且回复。 豆包直接生成了一个Python的代码,实现了微信公众号的后台接口,并且实现了签名认证,并且给出了详细的代码说明和注意事项。 然后我又要求使用Java+Spring Boot实现,它竟然给我实现了了一个完整的Maven项目。代码下载下来是真的可以跑的。 二、根据要求重构代码 在仔细看了下整个工程,代码就是一个Spring Boot的启动类,再加一个Controller。稍显不足的是,关于签名的代码,放在了Controller里,导致代码很乱。我随即发了一个优化建议: 把WechatController里的通用公共代码抽出去 这货竟然完全听懂了,乖乖的提取了一个Utils类,把签证签名,XML解析等相关的操作放了进去。 我又对比了下微信的API文档,我疑问道: POST接口不需要验证签名吗? 它竟然立马意识到自己的错误,修正了自己的错误: 三、根据要求增添内容 我继续下达着我的命令: >请生成Spring Boot的配置文件 >再加入log4j2的日志框架,把相关的异常打到日志里 >把参数搞成对象,把解析xml改成通用的反序列化拦截器 >响应体也可以搞成对象,使用序列化拦截器 >把token改成配置项形式,放在配置文件里 >使用langchain4j集成调用deepseek。当微信用户发来消息以后,转发给deepseek,然后把响应给微信用户 >Spring Boot的方式初始化langchain4j 并且把相关代码抽出去单独的类,整个项目包名改成com.zhaoyanblog.agent项目名称微blog-agent >帮我在pom里设置国内的maven仓镜像地址 >集成对wordpress的访问,当微信用户请求“wp:” 开头的信息时,搜索WordPress里的文章,返回给用户。 >微信返回的消息 要是一个包含文章的摘要富媒体链接,业务点击消息可以跳转到网站。WordPress的网站地址zhaoyanblog.com。要放在配置文件里。 关于微信的Token也放在额外的类里,不要放在controller里 >请对工程使用Spring boot的方式配置accesslog, >配置文件里的注释在IDEA里是乱码,请修正. …… 它就像一个不知疲倦的程序员,不断的实现着产品经理提出的需求 四、帮我修正Bug 有关freemarker模版的问题,开始我希望把markdown改成HTML。它一开始给我的代码其中有这样一段: <p class="text-gray-800"><span class="speaker-highlight">DeepSeek</span>:<#noescape>${conversation.getContentAsHtml()}</#noescape></p> 但是我真实跑起来的时候,它报这样的错误 #noescape with no matching #escape encountered 它直接给我了解决方案,并解释了原因: <span class="speaker-highlight">DeepSeek</span>:${conversation.getContentAsHtml()?no_esc}</p> 但是好像还不行,我直接把报错信息再贴给它 ?no_esc can't be used here, as the current output format isn't a markup (escaping) format: undefined(mimeType=null, class=f.c.UndefinedOutputFormat) 这次它给的答案,完美解决了问题: 五、竟然提示我遵守规范 ...
本小站正式从阿里云迁往华为云
本站在阿里云ECS已经有5年之久了,1C2G的配置,1M带宽 外加20G云盘,一年要耗费1100多大洋~~。随着云化技术的发展,一直等着阿里能有优惠,然而一直都如此。 碰巧前段时间看到华为云的优惠活动。新注册用户 2C4G的HECS 3年只要700多。瞬间心动,直接买了。 前段时间增加了域名备案,但是一直没有机会把主机迁移。 今晚早下班,一并做了迁移。同时把好久没升级的nginx和php都升级到了最新版本 华为云 棒棒的^_^
Spring源码阅读(一):Spring是如何扫描某个包下面所有的类
Spring扫描注解的功能 我们知道在Spring中可以使用注解声明Bean,可以让我们不用再去配置繁琐的xml文件,确实让我们的开发简便不少。只要在Spring xml里配置如下,就开启了这项功能。 <context:component-scan base-package="com.zhaoyanblog" /> Spring就会自动扫描该包下面所有打了Spring注解的类,帮你初始化病注册到Spring容器中。 @Service public class UserController { @Autowired private UserDao userDao; //TODO } 上述行为,就和在xml里进行下面的配置是等价的。 <bean class="com.zhaoyanblog.UserController"> <property name="userDao" ref="userDao" /> </bean> 那么问题来了,Spring是怎么扫描到com.zhaoyanblog包下面的所有带注解的类的呢? context:component-scan标签的处理者 要弄清楚为什么在xml里配置了context:component-scan就可以实现这样的功能,就要现找到这个标签的处理者。我们很容易联想到Spring解析xml的基本原理,就是遇到这个标签以后,交给一个类处理,这个类扫描包下带注解的类,初始化成对象。我们就是要找到这个关键的类。 Spring对Xml的解析功能后面阅读,这里先简要描述。Spring的jar包里有两个重要的配置文件:spring.schemas和spring.handlers,在META-INF目录下。 spring.schemas记录了xml的每个命名空间,对应的Schema校验XSD文件在哪个目录。 http\://www.springframework.org/schema/context/spring-context-4.2.xsd=org/springframework/context/config/spring-context.xsd http\://www.springframework.org/schema/context/spring-context-4.3.xsd=org/springframework/context/config/spring-context.xsd http\://www.springframework.org/schema/context/spring-context.xsd=org/springframework/context/config/spring-context.xsd spring.handlers里配置了每个命名空间的标签都由哪个类处理 http\://www.springframework.org/schema/context=org.springframework.context.config.ContextNamespaceHandler http\://www.springframework.org/schema/jee=org.springframework.ejb.config.JeeNamespaceHandler http\://www.springframework.org/schema/lang=org.springframework.scripting.config.LangNamespaceHandler http\://www.springframework.org/schema/task=org.springframework.scheduling.config.TaskNamespaceHandler http\://www.springframework.org/schema/cache=org.springframework.cache.config.CacheNamespaceHandler 我们可以看到context这个命名空间由org.springframework.context.config.ContextNamespaceHandler这个类处理。打开这个类 public class ContextNamespaceHandler extends NamespaceHandlerSupport { @Override public void init() { registerBeanDefinitionParser("property-placeholder", new PropertyPlaceholderBeanDefinitionParser()); registerBeanDefinitionParser("property-override", new PropertyOverrideBeanDefinitionParser()); registerBeanDefinitionParser("annotation-config", new AnnotationConfigBeanDefinitionParser()); registerBeanDefinitionParser("component-scan", new ComponentScanBeanDefinitionParser()); registerBeanDefinitionParser("load-time-weaver", new LoadTimeWeaverBeanDefinitionParser()); registerBeanDefinitionParser("spring-configured", new SpringConfiguredBeanDefinitionParser()); registerBeanDefinitionParser("mbean-export", new MBeanExportBeanDefinitionParser()); registerBeanDefinitionParser("mbean-server", new MBeanServerBeanDefinitionParser()); } } 这个类为每个标签都给出了一个处理类,component-scan的处理类是ComponentScanBeanDefinitionParser 继续打开ComponentScanBeanDefinitionParser private static final String BASE_PACKAGE_ATTRIBUTE = "base-package"; public BeanDefinition parse(Element element, ParserContext parserContext) { String basePackage = element.getAttribute(BASE_PACKAGE_ATTRIBUTE); basePackage = parserContext.getReaderContext().getEnvironment().resolvePlaceholders(basePackage); String[] basePackages = StringUtils.tokenizeToStringArray(basePackage, ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS); // Actually scan for bean definitions and register them. ClassPathBeanDefinitionScanner scanner = configureScanner(parserContext, element); Set<BeanDefinitionHolder> beanDefinitions = scanner.doScan(basePackages); registerComponents(parserContext.getReaderContext(), beanDefinitions, element); return null; } 看到这里整明白了,扫描某个包下面的所有类的工作,就是ClassPathBeanDefinitionScanner干的。入口是doScan方法。 查找所有的包路径 ClassPathBeanDefinitionScanner有很多细节,比如可以设置class的filter, 设置classloader等等,我们先关注最主要的功能,就是怎么找到一个包下面所有的类的。 通过调用关系,一路找下去 doScan->findCandidateComponents(super)->scanCandidateComponents(super) private Set<BeanDefinition> scanCandidateComponents(String basePackage) { Set<BeanDefinition> candidates = new LinkedHashSet<>(); try { String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + resolveBasePackage(basePackage) + '/' + this.resourcePattern; Resource[] resources = getResourcePatternResolver().getResources(packageSearchPath); 我们发现,原来Spring是在classpath下面,通过查找所有classpath*:com/zhaoyanblog/**/*.class的文件来实现的啊。 ...
强烈推荐阿里云镜像站
阿里巴巴构建的阿里云开发者社区真是懂程序员所想,这里有一切你想你要的。 主页: https://developer.aliyun.com 特别是它的阿里云镜像站,真是一个大宝藏啊 https://developer.aliyun.com/mirror/ 里面包含所有Linux版本的操作系统镜像 此外还有: DNS解析 https://developer.aliyun.com/mirror/DNS NTP服务器 https://developer.aliyun.com/mirror/NTP 各种语言的镜像: python pypi软件仓 https://developer.aliyun.com/mirror/pypi rubygems https://developer.aliyun.com/mirror/rubygems maven仓镜像 https://maven.aliyun.com/mvn/view npmjs https://developer.aliyun.com/mirror/NPM
从苹果发布会看华为的创新地位
北京时间2019年9月11日凌晨1点,苹果秋季发布会在乔布斯大剧院如期举行,发布了最新款手机 iphone11系列。 iphone11系列能拿得出手提升主要有两个: 一是后置1200万三摄,兼顾广角和长焦,4倍光学变焦,增强夜间模式。二是最新7nm仿生芯片A13,集成85亿个晶体管,提升AI计算能力。注意不支持5G! 此外媒体还总结了6大卖点,除上面两点还包括:电池更大,18W快充,全新配色,售价更便宜。 通过苹果的发布会,我们可以看到目前全球手机厂商的创新点主要聚焦在三个方面:拍照、芯片、AI计算。 而横向比较,我们看一下华为。 首先华为是手机多摄像头方案的鼻祖,华为每款最新旗舰机手机发布拍照能力都会霸榜DxOMark。最新mate30在拍照能力上让人充满期待。 从16nm的950,到7nm的990,华为已经站在了CPU制程的最前沿。麒麟990芯片是世界上首款支持5G双模的7nm终端芯片,集成首次超100亿晶体管。将会用在随后发布的Mate30系列上。这次苹果发布会第一次吧麒麟芯片作为对比对象。但是却拿的华为上一代产品麒麟980. AI方面华为是最先提出NPU的概念,到990已经是好几代了。 我们发现不知不觉华为已经站在了手机创新的前列甚至于制高点上。苹果已经不在是创新的代名词。有人评论这可能是苹果最后一次享受乔布斯的遗产红利,通过简单修改一下参数就可以卖的很好。 最后让我们拭目以待华为9.19 最新Mate30系列全球发布会。
大岩评“小米自研30W无线闪充”
小米9月9日发布了全球首款30W无线闪充,然后小米高管微博开始宣传造势。 然而有网友质疑小米30W无线闪充使用了和华为相同的供应商IDT的技术方案。 时隔三日,9月12日小米产品总监王腾Thomas长篇回应质疑。 大肆宣传快充最开始有OV发起的,“充电五分钟通话两小时” 广告狂轰乱炸确实带起了OV销量。 前段时间荣耀发布荣耀9X用了10W充电,小米高管卢伟冰带了一波节奏,我想小米可能想趁热继续在充电上冲一冲,给粉丝一个小米有技术的印象。 但是我们分析这篇王腾的回复博文,看到的不是小米对技术的自信,而是心虚和掩饰。看到这5条创新技术,我感受到是小米的绞尽脑汁,勉强无力。 且看其中包括充电策略,保护算法这不是一个手机充电必须有的吗? 安全加密机制算法,我都有点乱了,这里是说加密算法,还是加密的机制?有这样称呼的吗?这个自研的算法安全吗? 可以想象小米是费了多大的劲才挑选出这样的让读者感觉表面有点技术含量的词语啊。 然而最最核心的无线充电芯片,也被加上了“供应商根据小米的需求和电路架构为小米设计”的修饰语。 我的结论是: 雷军一直说自己是科技节的无印良品,追求颜值和性价比。但是手机是一个高科技产业,手机厂商竞争进入了白日化阶段,没有核心技术的厂商会逐渐被淘汰和边缘化。 小米的底牌可能真的不多了。俗话说穷则思变,小米是时候需要把更多精力放在科技创新,打造更多核心竞争力上,而不是高管集体在微博上面耍嘴皮子。
大岩评“卢十瓦”事件
2019年7月23日,荣耀在西安发布了荣耀X系列的下一代产品荣耀9X系列。4800像素三射,升降摄像头,PC液冷,4000mA大电池,前置指纹识别。同时搭载7nm制程的麒麟810芯片,拥有方舟编译器、EROFS超级文件系统、GPU Turbo 3.0、麒麟Gaming+技术、AI视频防抖,AI智慧通信2.0等多项华为自研高科技。 然而它有一项不尽人意的地方,就是充电仅支持5V2A=10W功率充电器。 小米副总裁卢伟冰抓住这一点不放,在微博上连续多天发文提及此事: 7月23日:“今天友商的产品让人费解,请教: 1.手机支持18W快充,inbox充电器不支持2.手机和充电器都不支持,是哪个?请大家指教” 7月24日:“今天的手机竞争,产品一定要有自己的特色和长板,而且一定不能有短板,尤其是用户非常关注的处理器、拍照、电池、快充、外观材质等,绝对不能偷工减料。卖2399元的手机只支持10W充电,在Redmi团队的话产品经理肯定被开!” 7月25日:“炮制虽繁,必不敢省人工,品味虽贵,必不敢减物力 ”7月26日: “按照友商的理论,我不用做任何测试,先下个结论:充电能力,10W的友商9X/9XPro,一定远落后于18W的小金刚Pro。因为这个世界真的是有“科学常识”存在。世界最顶级的专家,也不可能把10W优化出18W的快充能力。” 7月27日:“五年前的红米Note第一代,就已经是10W充电了…所以最近有点恍惚,好像回到了几年前。但,永远相信美好的事情即将发生” 7月28日:“Redmi 7A是我们高品质的入门款手机,4000mah大电池,售价只要549元,同样标配10W充电。我在想,下一代还要不要继续用10W呢?” 为了把事情彻底闹大 7月29日: “Redmi全民快充计划,划重点: 1.价值29.9元的18W充电器小米商城1元闪购 2.Note7 6+64版本闪降200元仅1199并加送18W充电器。 明天上午10.08分开售,全民进入18W快充时代,告别10W!” 于是网友送了一个外号 叫 “卢十瓦”, 并且产生一个功率单位1卢=10W 卢伟冰在最新的微博里也自嘲“最近不少网友叫我“卢十瓦”,我觉得这其实是件好事,因为这一定会促进产业的共同进步,能给用户带来更好的体验,我预测友商的下一代产品也不会再用10W充电了。想做出好产品就一定要较真!”, 以行业良心自居,和网友打的是热火朝天。这就是“卢十瓦”事件的背景。 我想从另外一个角度分析这个问题:荣耀9X用10W就是偷工减料吗? 荣耀没有技术水平让荣耀9X用上更大功率的快充吗? 显然不是,我想打个比喻:有一天马云骑着自行车锻炼身体,一位开着马自达的上班族看到了,嘲笑马云没有开上马自达。 马云是开不起马自达吗? 但是此时此刻马云他就是需要骑自行车。 荣耀千元机直接上7nm对小米来说就是致命性的降维打击。10W充电就是故意卖个破绽给你。小米体会不到自己的危机,反而操弄起自己熟悉的社会营销。 试想小米任何一款手机,其它任何手机厂商是不是立马就可以造出来? 华为的手机,小米可以造出来吗? 甚至于OV厂手机的一两个特性,小米都搞不出来。没有核心关键技术的企业是不可持续的,也许这就是为什么在资本市场,小米盈利能力不错,仍然被看衰,股票一跌再跌的原因吧。 通过荣耀9X,“卢十瓦”事件,表面看到的是小米的接地气,性价比。更深层次看到的是小米的未来危机,没有核心关键技术,深陷社会营销的小米到底还能走多远?