首页 文章 精选 留言 我的

精选列表

搜索[声音工坊],共7934篇文章
优秀的个人博客,低调大师

【曹工杂谈】Maven IOC容器的下半场:Google Guice

前言 在前面的文章里,Maven底层容器Plexus Container的前世今生,一代芳华终落幕,我们提到,在Plexus Container退任后,取而代之的底层容器是Guice。 Guice的应用也还比较广泛,以下轮子中(仅部分)都有它活跃的身影: google内部 scalatest TestNG Caffeine Cache Spring Security Config elastic search jenkins 这很多轮子,都是直接用的Guice,那是因为没什么历史包袱;但Maven不一样,maven之前用自己的IOC轮子,有自己独特的定义组件的方式(比如Spring通过@Component注解来定义);但是Guice作为一个独立的IOC框架,那肯定是不认识Maven中的组件的。 因此,这中间肯定需要兼容啊,Maven的组件,还是用的Plexus IOC容器那套方式去定义,但是他们开发了一个中间层,把那些组件解析后,存放到了Guice容器中。 这里说,把组件解析后,存放到了Guice容器中,这个也不是特别准确,更准确的说法是,放到了基于Guice进行了一层封装的一个容器中,这个容器叫做:sisu,由eclipse在维护这个开源项目(https://www.eclipse.org/sisu/)。 可能你就疑惑了,就一个破IOC,搞得多有技术含量一样,还一层套一层。。这个我们就先不管了,这期我先讲Guice,然后大家就懂了,为啥Sisu要要封装一层了。总结一下,依赖路径是: 最底层的是google Guice --》 sisu(eclipse)--》 sisu-plexus兼容层--》plexus --》maven。 好了,开始正文。 Guice是什么 根据wiki的描述,Guice就是依赖注入框架,由google开源。主要特点就是:支持以java注解的方式配置组件及依赖。最早的版本应该是在2007年,我还找到一篇当年的报道 https://developers.googleblog.com/2007/03/, 当时还是2007年,而2004年的时候,支持注解的JDK1.5才放出来,与此同时,Spring早期版本主要也还是以xml配置为主,Guice在那时就支持全注解配置,以当时的眼光来看,很前沿了。 接下来,我们就来仔细了解下Guice的用法。 核心理念 在开始讲之前,我说下我对IOC框架的理解先。很多时候,可以简单地说,IOC容器是一个map,一个放东西的地方,就像一个中药房,每个格子里会放一种药材,而每个格子上,有一个标签,来说明里面放的是什么药材。 既然是放东西的地方,核心就是两个部分,怎么放,放的时候,可能就要考虑到后续怎么找的问题。比如,如果你打算只支持根据物品的类型来找,那你要考虑到:如果这个类型的物品有多个,要怎么办?怎么区分这多个物品? 如果你打算解决这个问题,那你可能就会想:那我放的时候,再给这些物品取个名字吧,免得多个相同类型的物品,分不清。 甚至呢,你可能会考虑,物品的权限隔离,比如,物品上再加个存放人的字段,以后取得时候,就只能:自己取自己的,不能取别人的。 反正,最终还是看需求,一般来说,像我们spring这种,按类型就差不多了,一个类型多个实现的时候,再根据名字区分一下就ok。 而Guice呢,我这边会重点讲解:怎么存。至于取,可能还分成两种,依赖注入和直接从容器中取。但是依赖注入的底层实现,也是:发现我依赖的某个东西没有,就去容器里取。 所以,取东西,我们只需要关注:直接从容器中怎么获取就行;我这边就不会特别关注依赖注入的问题。 Guice中,存东西的多种方式 概览 存东西,在Guice的文档里,名词叫做Binding,中文就是绑定吧。 https://github.com/google/guice/wiki/Bindings 绑定是什么意思,就是我最终可能需要从容器中获取ClassA类型的对象。既然要取,那还得先存,存的时候,我就要建立绑定:ClassA --》该Class类型对象的获取方式。 其实还是很简单的。下边就跟着我的代码例子,我们来看看。 以下全部的代码,都在: https://gitee.com/ckl111/maven-3.8.1-source-learn/tree/master/my-test-modules/official-guice-demo 1. linkedbinding-绑定接口到实现类 先来一个接口和实现: public interface HelloInterface { void hello(); } public class HelloInterfaceImpl implements HelloInterface { @Override public void hello() { System.out.println("hello world"); } } 再来看看,怎么放到容器,和简单的从容器中取出来的方法: 大家看我代码截图,放东西的时候,就是要指定这个接口,对应的实现类。 取东西的时候,再去根据接口取就行了。 2.BindingAnnotations 一个类型有多个实现类的时候的绑定方式 接口和多个实现类: interface HelloInterface { void hello(); } class HelloInterfaceImpl implements HelloInterface { @Override public void hello() { System.out.println("hello world"); } } class HelloInterfaceImpl2 implements HelloInterface { @Override public void hello() { System.out.println("hello world"); } } 如果我们还是按前面的办法去取,框架就晕圈了,多个实现类,我给你哪一个呢?麻烦再明确一下吧,ok吗 Guice有个注解,叫Named,可以加在各种地方,注解本身,支持设置名称。 这里意思就是说,你接口不是多个实现吗,那我们这样:接口+注解,才算是唯一的key,这样ok了吧。 因此,现在就变成了这样:接口+注解1 --》 实现类1;接口 + 注解2 --》 实现类2. 那我怎么取呢?简单啊,怎么存,怎么取,存的时候,用的接口+注解,取的时候,也需要这样。 既然,可以用官方的Named注解,那其实自己的注解也一样可以用。 3. InstanceBindings 接口直接绑定一个单例对象 如果同一个类型,要绑定到多个实例的情况,同前面的处理方式一样。 4. 绑定到工厂方法:授人以鱼不如授人以渔 前面都是些直来直去的办法,这次不一样,我只告诉你,这个东西的获得方法。 5. 不用接口了,直接绑定一个实现类 前面都是根据一个接口类,去取接口对应的实现之类的。这次不一样,直接就是一个实现类了。 public class UtilService { } 像上面这个情况,那肯定是直接调用这个类的构造函数了。 6. 接口绑定到一个构造函数:ToConstructorBindings 哎,我是越来越无语了,Guice的骚操作真是多啊。 7. 内置的不用绑就能用的 主要有:Logger、Injector本身(就是相当于可以帮你注入容器自身) 8. 能不能不绑定直接用 用惯了spring的我们,现在已经是不需要这么绑来绑去了。我们看看Guice的支持怎么样 不绑定的话,可以这样: @ImplementedBy(TestInterfaceImpl.class) interface TestInterface { } 这就相当于,你要自己指定一下,你的实现类是谁,或者你的provider是谁。但是官方不建议用这种隐式绑定,不知道为啥,还出了个选项,专门禁用隐式绑定。 9. 一个接口多个实现类,一次性全获取回来 这个场景,就是一次性把多实现类一把取回来,放到一个集合里给你。 这个场景我没写代码,大家自己看一下文档,也简单。 10. 注入的方式 前面说了很多怎么手动从容器里面取,当然了,要自动注入的话,也是支持:构造器注入、field注入等等方式。 如以下为构造器注入: 其他支持的特性 其他的,比如循环依赖、aop也是大体支持的,只是这个容器在安卓端用,会有问题,因为aop好像不太支持,所以给安卓端还专供了一个去掉aop的版本。 循环依赖之类的,具体实现还没怎么看过。 另外,guice默认生成的是多例(类比spring的prototype,而不是singleton),但是本身也是支持singleton的,我前面的代码例子有。 最大槽点 可以看出,Guice是很轻量,轻量的意思是,功能没Spring那么全,所以,我们还需要去显式地:配置每个接口,要怎么获取它的对象(方法也是五花八门,哈哈哈,如前面展示的)。 当然,配置ok后,我们获取某对象的时候,它会帮我们去完成自动注入的东西。 但是,它也不支持类路径扫描啊,比如给个包名,自动去扫描这个包下面的组件,反正官方不支持,说是有第三方插件,还没试过。 总结 在各种轮子里,用来管理自己的代码间的相互依赖,用Guice确实足够了,用在业务代码,就还是有点累。 因为,主要是:各种依赖要自己配,只是集中在一个地方配置而已,没有像spring那样,约定通过接口找对象时,默认就是找实现类,然后反射生成对象。 这一点来说,确实是:约定优于配置,就像Maven为啥打败了ant,也是这个道理。 另外的问题就是,不支持spring的那种component-scan。 基于这两个问题呢,方法肯定是有的,所以,Maven也足够聪明,没有直接基于Guice,而是选择了基于Guice封装后的Sisu,而Sisu就可以解决我们说的问题,支持类路径扫描之类的。 我们看看sisu怎么介绍自己: 就是比Guice多了些看起来还很不错的、Spring早已有了的特性吧。回头我们肯定要再介绍sisu的。 再见,以上。 本文由博客一文多发平台 OpenWrite 发布!

优秀的个人博客,低调大师

工信部提示 AI 编程工具 Claude Code 存在安全后门隐患

近日,工业和信息化部网络安全威胁和漏洞信息共享平台(NVDB)监测发现,AI编程工具Claude Code存在安全后门隐患,危害严重。 Claude Code是美国Anthropic公司开发的AI编程工具,可根据文字需求自主完成代码编写、修复等工作。由于其内置了监控机制,未经用户同意即可向远程服务器回传用户地域、身份标识等敏感信息,受影响的Claude Code为2.1.91至2.1.196版本。 建议相关单位和用户立即开展全面排查,对于安装上述受影响版本的开发终端,立即卸载或升级至已清除相关后门代码的最新安全版本;加强核心业务网段内开发工具外联权限管控与流量监测,防止敏感数据违规外传。 来源:https://nvdb.org.cn/publicAnnouncement/2074681830578630657 推荐阅读: Claude Code 藏在系统提示词里的“暗门” Claude Code 官方 “投毒” 标记中国用户翻车,这次国外用户也怒了

优秀的个人博客,低调大师

工信部聚焦“AI+通信” 打造智算网络体系

工业和信息化部印发《“人工智能+信息通信”创新发展实施意见(2026—2028年)》。 《意见》主旨即“AI+通信”融合发展,核心目标是到2028年初步实现信息通信网络高等级自智,网络、算力等信息基础设施支撑人工智能能力进一步提升,城域算力1毫秒时延圈覆盖率不低于75%;到2030年,人工智能与信息通信网络融合关键核心技术取得显著突破,通感算智一体化服务能力大幅提升,形成完备的协同创新和产业生态体系。 当前,AI大模型训练、智算集群互联对网络带宽、时延、功耗提出极致要求,传统电互连架构已遭遇“带宽墙”“功耗墙”瓶颈。 “AI+通信”的深度融合,离不开一张高吞吐、低延迟的智算网络体系,而光电芯片和器件等基础硬件,决定了智算网络的性能上限。 这一背景下,《意见》将光电芯片、OCS器件、CPO器件等视作人工智能发展底座,提出加强高端光电芯片和器件研发,加强高速光电芯片、高速转发/交换芯片、全光交换器件、光电共封装器件等技术和产品研发验证,开展光电混合组网技术试验,加速技术方案成熟。加强智算超节点光电互联技术攻关,开展智算网络技术与产品验证。 OCS(Optical Circuit Switch)是目前最主流的全光交换技术路线,指的是基于全光信号的交换机设备,其工作原理是通过配置光交换矩阵,从而在任意输入和输出端口间建立光学路径以实现信号的交换。OCS无需光电/电光(O/E/O)转换,从底层规避了传统电交换在高速传输下的带宽瓶颈、功耗损耗问题,大幅降低了信号传输时延和功耗并提高了硬件使用寿命,系统故障概率也有所降低。 CPO(Co-packaged Optics,光电共封装技术)应用于光电共封装器件,即将交换芯片(ASIC)和光模块/光引擎共同封装在同一个基板之上,通过2.5D或3D先进封装工艺大幅缩短两者之间的电气连接距离。 另外,《意见》要求夯实网络支撑底座,加快建设400Gbps/800Gbps等骨干传输网络,优化东中西部国家枢纽节点之间网络传输通道。有序推进城域400Gbps及以上、全光交叉等高速光传输系统设备应用;提升网络智算服务能力,丰富光传送网(OTN)专线、无源光网络(PON)专线、IP专线等多种专线类型,实现业务快速开通和灵活调度。面向智能体、具身智能等上行带宽和时延需求,提升光纤接入网上行带宽配置,推进支持大上行能力的5G-A网络部署,优化网络体验,降低网络端到端时延。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册