1..NET跨平台开源控件库-SukiUI
2..NET跨平台框架选择之一 - Avalonia UI
3.Avalonia 实现聊天消息绘制、源码图文混排(支持Windows、源码Linux、源码信创国产OS)
4.盘点5个基于SkiaSharp开发的源码.Net开源图形项目
5.悼念司徒正美老师
6.Springä¸BeanFactoryä¸FactoryBeançä½ç¨ä¸åºå«
.NET跨平台开源控件库-SukiUI
Suki是控件库作者宠物狗的名字
SukiUI是一款桌面端和移动端的开源控件库,基于AvaloniaUI构建。源码AvaloniaUI是源码自定义节日提醒 源码一个跨平台的.NET框架,用于创建美观且现代化的源码图形用户界面(GUI)。AvaloniaUI支持包括Windows、源码macOS、源码Linux、源码iOS、源码Android和Web Assembly在内的源码多平台应用开发,并兼容所有支持.NET Standard 2.0的源码平台。AvaloniaUI官方网站为avaloniaui.net,源码中文文档可访问avaloniachina.gitbook.io。源码SukiUI提供了丰富的控件和组件,涵盖桌面端和移动端应用的开发需求。以下为SukiUI的一些特色控件和文档资源。
桌面端控件的文档可在线查阅,具体链接为[2]。移动端控件的文件详情请参考[3]。用户还可以根据需求进行自定义开发,相关信息位于[4]。为了提高应用的交互性,InteractiveContainer控件允许轻松集成Dialog和Toast等功能,以增强用户体验。用户可以访问[6]以获取详细的控件文档。
关于安装步骤,相关文档链接为[5]。赫尔指标源码此外,SukiUI的官方Wiki页面提供了更多详细信息和参考资料,访问链接为[1]。欲了解更多内容,用户可直接访问SukiUI的GitHub仓库,获取完整文档和源代码:github.com/kikipoulet/SukiUI。此开源控件库旨在为开发者提供一个全面、易用的解决方案,以适应不同平台的开发需求。
.NET跨平台框架选择之一 - Avalonia UI
本文介绍了跨平台框架 Avalonia UI,一个基于 WPF XAML 的跨平台 UI 框架,支持 Windows、Linux、MacOS、Android、iOS 和 WebAssembly。Avalonia UI 是一个强大而灵活的选择,它提供多种操作系统支持,简化了跨平台应用开发。本文通过介绍 Avalonia UI 的桌面三大平台演示和示例,旨在直观地展示 Avalonia UI 的优势和应用。
首先,Avalonia UI 通过一个音乐专辑搜索、展示小程序演示了它的功能。此案例提供了详细的教程和源码,方便开发者深入了解 Avalonia UI 的使用。在 Windows 和 macOS 上的演示,展示了 Avalonia UI 的按键正版源码强大性能,与使用 MAUI 相比,运行调试体验更为流畅。此外,站长升级版源码和案例演示为开发者提供了更多的实验空间和可能性。
在 Linux 平台上,虽然 Avalonia UI 支持多种操作系统,但当前存在一些小缺憾,如自定义标题栏未生效。不过,社区已经提供了解决 Linux 下字体问题的方案,确保了 Avalonia UI 在 Linux 环境下的正常运行。随着未来版本的更新,Linux 下的使用体验将进一步改善。
为了提供更全面的视角,本文还介绍了 Avalonia UI 在移动平台(iOS、Android)和 WebAssembly 上的支持情况。在国产麒麟 V 操作系统上的测试表明,Avalonia UI 能够适配不同的 CPU 指令集,包括完全自主的龙芯指令集、广泛兼容的 x 架构以及逐渐普及的 ARM 架构。这展示了 Avalonia UI 强大的跨平台兼容性和灵活性。
作为对比,文中还提到了 Avalonia UI 与 WPF 的相似之处,特别是在数据绑定方面。Avalonia UI 提供了与 WPF 类似的语法,使得开发者能够轻松地应用 WPF 的知识到 Avalonia UI 中。这种相似性使得 Avalonia UI 更容易上手,降低了学习成本。nacoa配置源码
JetBrains Rider 现已支持 Avalonia UI,为开发者提供了更加友好的 IDE 集成体验。此外,Avalonia UI 的社区项目允许开发者通过热重载功能快速迭代代码,提高开发效率。Avalonia UI 还支持与原生 API 的互操作性,允许开发者在应用中调用平台特定的 API,增强了应用的平台适应性。
在实际应用中,Avalonia UI 可以构建移动应用、桌面应用和网站。移动应用方面,Avalonia UI 已支持 Android 平台,并计划在未来支持 iOS 平台。在网站构建方面,虽然 Avalonia UI 还处于早期阶段,但已支持 WebAssembly 技术,使得完整的 Avalonia 应用程序能够在现代网络浏览器中运行。
最后,文章提供了参与 Avalonia UI 社区的指南,鼓励开发者加入并为该项目贡献自己的力量。Avalonia UI 的支持涵盖了多种 Linux 发行版和 macOS 版本,为开发者提供了广泛的平台选择。
Avalonia 实现聊天消息绘制、图文混排(支持Windows、Linux、信创国产OS)
在构建即时通讯软件或聊天应用时,渲染消息内容,pebble源码剖析尤其是包含文字表情、、动图等元素,是一项复杂而细致的工作。为了简化这一过程并提升开发效率,ESFramework 提供了 IChatRender 组件,该组件支持 Windows、Linux 系统,甚至包括信创国产操作系统。通过 IChatRender,开发者能够轻松实现类似微信的聊天消息渲染效果。
IChatRender 支持多种消息类型,包括文本表情、、GIF 动图、文件传输、个人与群名片、引用消息、语音通话、视频通话,以及撤回和删除消息等。这一组件旨在全面覆盖即时通讯应用中常见的消息样式,确保用户界面的丰富性和交互性。
在实现上,IChatRender 接口定义了消息渲染的核心逻辑。创建实例时,开发者可通过 ESFramework.Extensions.ChatRendering.ChatRenderFactory 提供的静态方法来实例化 IChatRender,参数包括特定平台的基础渲染实现(如 WinForm、WPF 或 Avalonia)和消息数据提供接口,以及用于实际渲染的 UI 控件。
对于自定义消息渲染的需求,IChatRender 提供了 AddChatItemCustomized 方法。开发者可以继承 BaseChatItem 类并重写相关方法,以适应特定消息类型的渲染需求。这一机制极大地增强了组件的灵活性,适应了不同应用的具体需求。
为了帮助开发者实践这一解决方案,ESFramework 提供了 ChatRenderDemo 源码,适用于 Linux(Avalonia)、Windows 等平台。源码包括基于 WPF 和 WinForm 的 Windows 端项目,以及基于 .NetCore 的 Linux 客户端项目,支持统信 UOS、银河麒麟等国产操作系统。特别地,Linux 端预装了 x/x 非托管 so 库,如需其他架构的库,开发者可通过评论区留言获取。
盘点5个基于SkiaSharp开发的.Net开源图形项目
基于SkiaSharp开发的.Net开源图形项目为开发者提供了强大的跨平台图形处理能力。这些项目涵盖了从富文本编辑、图像绘制到二维码生成、报表开发和处理等多个领域,展现了SkiaSharp在图形处理领域的广泛适用性与灵活性。
1. **富文本编辑工具**:此工具作为开源的富文本编辑器,支持.Net、.NetCoreapp2.1、.Net 5,提供丰富的字体样式,包括粗体、斜体、下划线等,同时支持Emoji和其他国际字符集的字体回退。此工具的代码地址位于github.com/toptensoftwa...。
2. **图像绘制工具**:此基于Avalonia开发的项目可在macOS、Linux、Windows上运行,允许开发者编写.Net应用程序进行图形绘制和渲染。通过编辑C#代码,开发者可以在右侧实时查看绘制效果。项目源代码位于github.com/mattleibow/S...。
3. **二维码开发库**:这是一个用于生成QR码的.NET库,支持生成文本、URL、二进制数据等多种类型的二维码,并能导出为PNG、JPG格式。同时,此库支持指定二维码的颜色、大小、背景等属性,并且具备跨平台能力。项目地址为github.com/guitarrapc/S...。
4. **报表开发库**:此简单的Xamarin.Forms图表库适用于报表或移动项目开发,提供丰富的示例作为学习资源。项目地址为github.com/NdubuisiJr/s...。
5. **处理开发库**:基于ASP.NET Core的图像处理工具,支持加载各种数据源的,包括HTTP、本地等,提供调整大小、裁剪、旋转等基本图像处理操作,并具备PDF转的功能。此库的代码地址位于github.com/usercode/Ima...。
这些项目展示了SkiaSharp在.Net生态系统中的强大应用潜力,适合不同场景的图形处理需求。开发者可以根据项目需求选择合适的开源库进行开发。
悼念司徒正美老师
悼念司徒正美老师,一颗璀璨的编程星辰陨落在JavaScript编程领域,我们失去了一位杰出的天才——司徒正美,原名钟钦成,年生于这个世界。他以开源框架avalon的创建者而闻名,一个在二次元与二进制之间游刃有余的“魔法师”,他的多才多艺令人惊叹,精通Java、Ruby和JavaScript,更曾著有《JavaScript框架设计》这一技术力作,为后辈留下了丰富的知识宝藏。
司徒老师在编程界的十多年里,留下了上千篇深具洞察力和技术深度的文章,他的每一篇文字都如同一颗璀璨的星子,照亮了前端开发者们的道路,成为了后人宝贵的技术遗产。他在去哪儿网担任前端架构师后,转战OPPO,然而遗憾的是,他在年3月日,岁的英年早逝,令人痛惜。
尽管与他未曾谋面,但他的开源框架avalon无疑对我有着深远的影响。作为一名初入前端的开发者,我曾有幸与他通过源码和issue交流,他那份对技术的热忱和无私的指导,至今仍让我深感敬佩。avalon在当时,犹如一颗璀璨的明珠,与Vue比肩,如果能得到更好的发展,或许会改写前端格局。
然而,司徒老师并非只是我一个人的技术导师,他的影响力波及整个前端开发者社区。他的个性,如网友所述,虽然不善言辞,却热爱动漫,戴着黑框眼镜,对工作充满专注,质朴而专一。他虽然在恋爱经历上略显空白,但他的技术和职业道德却如同程序员的典范,对政治保持距离,对待工作则坚韧不拔。
令人痛心的是,司徒老师的过早离世让我们不得不正视一个事实:在全球范围内,过度劳累已成为一种严重的职业健康问题,我国每年因过劳死的数字触目惊心。世界卫生组织将过劳死正式列为职业病,这无疑是对所有工作者的警醒。
愿天堂的司徒老师远离尘世的疲惫,只有二次元的欢笑,没有编程的辛劳。他的光芒将继续照亮那些在技术路上寻路的人,他的故事将激励我们更加珍视健康,追求技术与生活的平衡。
Springä¸BeanFactoryä¸FactoryBeançä½ç¨ä¸åºå«
Spring Frameworkï¼ä»å¹´å¤å¤©ä½ å¯è½å·²ç»å¬è§å¾å¤ç议论ãå¨æ¬æä¸,æå°è¯å¾è§£éSpringè½å®æä»ä¹ï¼åææä¹ä¼è®¤ä¸ºå®è½å¸®å©ä½ å¼åJ2EEåºç¨ç¨åºã å¦ä¸frameworkï¼ ä½ å¯è½æ£å¨æ³âä¸è¿æ¯å¦å¤ä¸ä¸ªçframeworkâãå½å·²ç»æ许å¤å¼æ¾æºä»£ç (åä¸æ) J2EE frameworkæ¶ï¼ä¸ºä»ä¹ä½ åºè¯¥è´¹å¿è¯»è¿ç¯æç« ,æä¸è½½Spring Frameworkï¼ æç¸ä¿¡Springæ¯ç¬ç¹ç,å 为è¥å¹²ä¸ªåå : . å®å®ä½çé¢åæ¯è®¸å¤å ¶ä»æµè¡çframework没æçãSpringå ³æ³¨æä¾ä¸ç§æ¹æ³ç®¡çä½ çä¸å¡å¯¹è±¡ã . Springæ¯å ¨é¢çå模ååçãSpringæåå±çä½ç³»ç»æ,è¿æå³çä½ è½éæ©ä½¿ç¨å®å¤ç«çä»»ä½é¨å,å®çæ¶æä»ç¶æ¯å å¨ç¨³å®çãå æ¤ä»ä½ çå¦ä¹ ä¸ï¼ä½ å¯å¾å°æ大çä»·å¼ãä¾å¦,ä½ å¯è½éæ©ä» ä» ä½¿ç¨Springæ¥ç®ååJDBCç使ç¨,æç¨æ¥ç®¡çææçä¸å¡å¯¹è±¡ã . å®ç设计ä»åºé¨å¸®å©ä½ ç¼åæäºæµè¯ç代ç ãSpringæ¯ç¨äºæµè¯é©±å¨å·¥ç¨ççæ³çframeworkã Springå¯¹ä½ çå·¥ç¨æ¥è¯´ï¼å®ä¸éè¦ä¸ä¸ªä»¥ä¸çframeworkãSpringæ¯æ½å¨å°ä¸ç«å¼è§£å³æ¹æ¡,å®ä½äºä¸å ¸ååºç¨ç¸å ³ç大é¨ååºç¡ç»æãå®ä¹æ¶åå°å ¶ä»framework没æèèå°çå 容ã 尽管å®ä» ä» æ¯ä¸ä¸ªä»å¹´2ææå¼å§çå¼æºå·¥ç¨ï¼ä½Springæè¾é¿çåå²æ ¹åºãè¿ä¸ªå¼æºå·¥ç¨æ¯èµ·æºèªæå¨å¹´åæåºççãExpert One-on-One J2EE设计ä¸å¼åã书ä¸çåºç¡ä»£ç ãè¿æ¬ä¹¦å±ç¤ºäºSpringèåçåºç¡æ¶æãç¶è,è¿ä¸ªåºç¡æ¶æçæ¦å¿µè¦è¿½æº¯å°å¹´çæ©äºæ¶å,并ä¸åæ äºæ为ä¸ç³»åæåçåä¸å·¥ç¨å¼ååºç¡ç»æçç»éªã ä»å¹´1æï¼Springå·²ç»è½æ·äºSourceForgeä¸ãç°å¨æ个å¼å人å,å ¶ä¸6æ¯é«åº¦æå ¥ç积æååã Springçæ¶ææ§çå¥½å¤ å¨æ们è¿å ¥ç»è以åï¼è®©æ们çä¸ä¸Springå¯ä»¥ç»ä¸ä¸ªå·¥ç¨å¸¦æ¥çä¸äºå¥½å¤: . Springè½ææå°ç»ç»ä½ çä¸é´å±å¯¹è±¡,æ è®ºä½ æ¯å¦éæ©ä½¿ç¨äºEJBãå¦æä½ ä» ä» ä½¿ç¨äºStrutsæå ¶ä»çå å«äºJ2EEç¹æAPIsçframeworkï¼ä½ ä¼åç°Springå ³æ³¨äºéçä¸çé®é¢ï¼ã . Springè½æ¶é¤å¨è®¸å¤å·¥ç¨ä¸å¯¹Singletonçè¿å¤ä½¿ç¨ãæ ¹æ®æçç»éªï¼è¿æ¯ä¸ä¸ªä¸»è¦çé®é¢ï¼å®åå°äºç³»ç»çå¯æµè¯æ§åé¢å对象ç¹æ§ã . Springè½æ¶é¤ä½¿ç¨åç§åæ ·æ ¼å¼çå±æ§å®å¶æ件çéè¦,å¨æ´ä¸ªåºç¨åå·¥ç¨ä¸ï¼å¯éè¿ä¸ç§ä¸è´çæ¹æ³æ¥è¿è¡é ç½®ãæ¾ç»æå°è¿·æï¼ä¸ä¸ªç¹å®ç±»è¦æ¥æ¾è¿·å¹»è¬çå±æ§å ³é®åæç³»ç»å±æ§,为æ¤ä¸å¾ä¸è¯»Javadocä¹è³æºç¼ç åï¼æäºSpringï¼ä½ å¯å¾ç®åå°çå°ç±»çJavaBeanå±æ§ãåç½®æ§å¶ç使ç¨(å¨ä¸é¢è®¨è®º)帮å©å®æè¿ç§ç®åã . Springè½éè¿æ¥å£èä¸æ¯ç±»ä¿è¿å¥½çç¼ç¨ä¹ æ¯ï¼åå°ç¼ç¨ä»£ä»·å°å ä¹ä¸ºé¶ã . Spring被设计为让使ç¨å®å建çåºç¨å°½å¯è½å°çä¾èµäºä»çAPIsãå¨Springåºç¨ä¸ç大å¤æ°ä¸å¡å¯¹è±¡æ²¡æä¾èµäºSpringã . 使ç¨Springæ建çåºç¨ç¨åºæäºåå æµè¯ã . Springè½ä½¿EJBç使ç¨æ为ä¸ä¸ªå®ç°éæ©,èä¸æ¯åºç¨æ¶æçå¿ ç¶éæ©ãä½ è½éæ©ç¨POJOsælocal EJBsæ¥å®ç°ä¸å¡æ¥å£ï¼å´ä¸ä¼å½±åè°ç¨ä»£ç ã . Spring帮å©ä½ 解å³è®¸å¤é®é¢èæ é使ç¨EJBãSpringè½æä¾ä¸ç§EJBçæ¿æ¢ç©ï¼å®ä»¬éäºè®¸å¤webåºç¨ãä¾å¦,Springè½ä½¿ç¨AOPæä¾å£°ææ§äºå¡èä¸éè¿ä½¿ç¨EJB容å¨ï¼å¦æä½ ä» ä» éè¦ä¸å个çæ°æ®åºæ交éï¼çè³ä¸éè¦JTAå®ç°ã . Spring为æ°æ®ååæä¾äºä¸è´çæ¡æ¶,ä¸è®ºæ¯ä½¿ç¨JDBCæO/R mapping产åï¼å¦Hibernateï¼ã Springç¡®å®ä½¿ä½ è½éè¿æç®åå¯è¡ç解å³åæ³è§£å³ä½ çé®é¢ãè¿äºç¹æ§æ¯æå¾å¤§ä»·å¼çã Springè½åä»ä¹ï¼ Springæä¾è®¸å¤åè½,å¨æ¤æå°å¿«éå°ä¾æ¬¡å±ç¤ºå ¶å个主è¦æ¹é¢ã ä»»å¡æè¿°ï¼ é¦å ,让æ们æç¡®Springèå´ã尽管Springè¦çäºè®¸å¤æ¹é¢ï¼ä½æ们已ç»ææ¸ æ¥çæ¦å¿µï¼å®ä»ä¹åºè¯¥æ¶ååä»ä¹ä¸åºè¯¥æ¶åã Springç主è¦ç®çæ¯ä½¿J2EEæç¨åä¿è¿å¥½ç¼ç¨ä¹ æ¯ã Springä¸éæ°å¼åå·²æçä¸è¥¿ãå æ¤ï¼å¨Springä¸ä½ å°åç°æ²¡ææ¥å¿è®°å½çå ,没æè¿æ¥æ± ,没æåå¸äºå¡è°åº¦ãè¿äºåæå¼æºé¡¹ç®æä¾(ä¾å¦Commons Logging ç¨æ¥åææçæ¥å¿è¾åºï¼æCommons DBCPç¨æ¥ä½æ°æ®è¿æ¥æ± ),æç±ä½ çåºç¨ç¨åºæå¡å¨æä¾ãå 为åæ ·ççåå ï¼æ们没ææä¾O/R mappingå±ï¼å¯¹æ¤ï¼å·²ææ好ç解å³åæ³å¦HibernateåJDOã Springçç®æ æ¯ä½¿å·²åå¨çææ¯æ´å æç¨ãä¾å¦,尽管æ们没æåºå±äºå¡åè°å¤çï¼ä½æ们æä¾äºä¸ä¸ªæ½è±¡å±è¦çäºJTAæä»»ä½å ¶ä»çäºå¡çç¥ã Spring没æç´æ¥åå ¶ä»çå¼æºé¡¹ç®ç«äºï¼é¤éæ们æå°æ们è½æä¾æ°çä¸äºä¸è¥¿ãä¾å¦ï¼è±¡è®¸å¤å¼å人åï¼æ们ä»æ¥æ²¡æ为Strutsé«å ´è¿ï¼å¹¶ä¸æå°å¨MVC web frameworkä¸è¿ææ¹è¿çä½å°ãå¨æäºé¢åï¼ä¾å¦è½»é级çIoC容å¨åAOPæ¡æ¶ï¼Springæç´æ¥çç«äºï¼ä½æ¯å¨è¿äºé¢åè¿æ²¡æå·²ç»è¾ä¸ºæµè¡ç解å³æ¹æ¡ã(Springå¨è¿äºåºåæ¯å¼è·¯å éã) Springä¹å¾çäºå å¨çä¸è´æ§ã ææçå¼åè é½å¨å±åæ ·ççèµæ,åºç¡æ³æ³ä¾ç¶æ¯Expert One-on-One J2EE设计ä¸å¼åçé£äºã 并ä¸æ们已ç»è½å¤ä½¿ç¨ä¸äºä¸»è¦çæ¦å¿µ,ä¾å¦åç½®æ§å¶ï¼æ¥å¤çå¤ä¸ªé¢åã Springå¨åºç¨æå¡å¨ä¹é´æ¯å¯ç§»æ¤çã å½ç¶ä¿è¯å¯ç§»æ¤æ§æ»æ¯ä¸æ¬¡ææï¼ä½æ¯æ们é¿å ä»»ä½ç¹å®å¹³å°æéæ åå,并ä¸æ¯æå¨WebLogicï¼Tomcatï¼Resinï¼JBossï¼WebSphereåå ¶ä»çåºç¨æå¡å¨ä¸çç¨æ·ã åç½®æ§å¶å®¹å¨ Springçè®¾è®¡æ ¸å¿æ¯ org.springframework.beans å , 为ä¸JavaBeansä¸èµ·å·¥ä½è设计ã è¿ä¸ªå ä¸è¬ä¸ç´æ¥è¢«ç¨æ·ä½¿ç¨, ä½ä½ä¸ºåºç¡ä¸ºæ´å¤çå ¶ä»åè½æå¡. ä¸ä¸ä¸ªè¾é«å±é¢çæ½è±¡æ¯"Bean Factory"ã Spring bean factory æ¯ä¸ä¸ªæ®éçFactoryï¼å®ä½¿å¯¹è±¡è½å¤æå称è·åï¼å¹¶ä¸è½ç®¡ç对象ä¹é´çå ³ç³»ã Bean factories æ¯æ两ç§å¯¹è±¡æ¨¡å¼: . Singletonï¼å¨æ¤æ¨¡å¼ä¸ï¼æä¸ä¸ªå ·æç¹å®å称çå ±äº«å¯¹è±¡å®ä¾ï¼å®å¨æ¥æ¾æ¶è¢«è·åãè¿æ¯é»è®¤çï¼èä¸æ¯æ为ç»å¸¸ä½¿ç¨çãå®å¯¹äºæ ç¶æ对象æ¯ä¸ç§çæ³ç模å¼ã .Prototypeï¼å¨æ¤æ¨¡å¼ä¸ï¼æ¯æ¬¡è·åå°å建ä¸ä¸ªç¬ç«ç对象ãä¾å¦ï¼è¿å¯ä»¥è¢«ç¨äºå 许ç¨æ·æ¥æä»ä»¬èªå·±ç对象ã ç±äº org.springframwork.beans.factory.BeanFactoryæ¯ä¸ä¸ªç®åçæ¥å£ï¼å®è½è¢«ä¸ºäºåºå±åå¨æ¹æ³èå®ç°ãä½ è½å¤æ¹ä¾¿å°å®ç°ä½ èªå·±çBeanFactoryï¼å°½ç®¡å¾å°ç¨æ·éè¦ãæ为常ç¨çå®ä¹æ¯ï¼ .XmlBeanFactoryï¼ å¯è§£æç®åç´è§çå®ä¹ç±»åå½å对象å±æ§çXMLç»æã æ们æä¾äºä¸ä¸ªDTDæ¥ä½¿ç¼åæ´å®¹æã .ListableBeanFactoryImplï¼å¯æä¾è§£æåæ¾å¨å±æ§æ件ä¸çbeanå®ä¹ï¼åå¯éè¿ç¼ç¨å建BeanFactoriesã æ¯ä¸ªbeanå®ä¹å¯è½æ¯ä¸ä¸ªPOJO(éè¿ç±»ååJavaBeanåå§å±æ§å®ä¹)ï¼ææ¯ä¸ä¸ªFactoryBeanãFactoryBeanæ¥å£æ·»å äºä¸ä¸ªé´æ¥å±ãé常ï¼è¿ç¨äºä½¿ç¨AOPæå ¶ä»æ¹æ³æ¥å建代ç对象ï¼ä¾å¦ï¼æ·»å äºå£°ææ§äºå¡ç®¡çç代çã(è¿å¨æ¦å¿µä¸åEJB侦å¬ç¸ä¼¼ï¼ä½å¨å®è·µä¸å®ç°æ´ç®åã) BeanFactoriesè½å¨ä¸ä¸ªå±æ¬¡ç»æä¸å¯éæ©æ§çåä¸ï¼æ ¹æ®æ¥èªç¥å ç继æ¿å®ä¹ãè¿ä½¿å¨æ´ä¸ªåºç¨ä¸å ¬å ±é ç½®çå ±äº«æ为å¯è½ï¼è½ç¶ä¸ªå«èµæºï¼å¦controller servletsï¼ä¹æ¥æä»ä»¬èªå·±çç¬ç«ç对象éåã è¿ç§ä½¿ç¨JavaBeansçå¨æºå¨ç第åç« ä¸ææè¿°ï¼å¨TheServerSideç½ç«ä¸çæå è´¹çPDF(). éè¿BeanFactoryæ¦å¿µï¼Springæ为ä¸ä¸ªåç½®æ§å¶ç容å¨ã(æé常ä¸å欢containerè¿ä¸ªæ¯è¯ï¼å 为å®ä½¿äººèæ³å°éé级容å¨ï¼å¦EJB容å¨ãSpringçBeanFactoryæ¯ä¸ä¸ªå¯éè¿ä¸è¡ä»£ç å建ç容å¨ï¼å¹¶ä¸ä¸éè¦ç¹æ®çé¨ç½²æ¥éª¤ã) ä½äºåç½®æ§å¶èåçæ¦å¿µæ¯å¨Hollywoodååä¸ç»å¸¸è¡¨è¿°ï¼"Donât call me, Iâll call you." IoCå°æ§å¶èè´£æ¬è¿äºæ¡æ¶ä¸ï¼å¹¶è±ç¦»åºç¨ä»£ç ãæ¶åå°é ç½®çå°æ¹ï¼æææ¯è¯´å¨ä¼ ç»ç容å¨ä½ç³»ç»æä¸ï¼å¦EJBï¼ä¸ä¸ªç»ä»¶å¯ä»¥è°ç¨å®¹å¨å¹¶é®âæéè¦å®ç»æåå·¥ä½ç对象Xå¨åªé?âï¼ä½¿ç¨IoC容å¨ååªéæåºç»ä»¶éè¦X对象ï¼å¨è¿è¡æ¶å®¹å¨ä¼æä¾ç»å®ã容å¨åºäºæ¹æ³åä½åºè¿ç§è¯´æï¼æå¯è½æ ¹æ®é ç½®æ°æ®å¦XMLã åç½®æ§å¶çå 个éè¦å¥½å¤ãå¦ï¼ . å 为ç»ä»¶ä¸éè¦å¨è¿è¡æ¶é´å¯»æ¾åä½è ï¼æ以ä»ä»¬å¯ä»¥æ´ç®åçç¼ååç»´æ¤ãå¨SpringçIoCçæ¬éï¼ç»ä»¶éè¿æ´é²JavaBeançsetteræ¹æ³è¡¨è¾¾ä»ä»¬ä¾èµçå ¶ä»ç»ä»¶ãè¿ç¸å½äºEJBéè¿JNDIæ¥æ¥æ¾ï¼EJBæ¥æ¾éè¦å¼å人åç¼å代ç ã . åæ ·åå ï¼åºç¨ä»£ç æ´å®¹ææµè¯ãJavaBeanå±æ§æ¯ç®åçï¼Javaæ ¸å¿çï¼å¹¶ä¸å®¹ææµè¯ï¼ä» ç¼åä¸ä¸ªå å«èªèº«çJunitæµè¯æ¹æ³ç¨æ¥å建对象å设置ç¸å ³å±æ§å³å¯ã . ä¸ä¸ªå¥½çIoCå®ç°éèäºå¼ºç±»åãå¦æä½ ä½¿ç¨ä¸ä¸ªæ®éçfactoryæ¥å¯»æ¾åä½è ï¼ä½ å¿ é¡»éè¿ç±»å转æ¢å°è¿åç»æ转å为æ³è¦çç±»åãè¿ä¸æ¯ä¸ä¸ªä¸»è¦é®é¢ï¼ä½æ¯ä¸é è§ã使ç¨IoCï¼ä½ å¨ä½ ç代ç ä¸è¡¨è¾¾å¼ºç±»åä¾èµï¼æ¡æ¶å°è´è´£ç±»å转æ¢ãè¿æå³çå¨æ¡æ¶é ç½®åºç¨æ¶ï¼ç±»åä¸å¹é å°å¯¼è´é误ï¼å¨ä½ ç代ç ä¸ï¼ä½ æ éæ å¿ç±»å转æ¢å¼å¸¸ã . 大é¨åä¸å¡å¯¹è±¡ä¸ä¾èµäºIoC容å¨çAPIsãè¿ä½¿å¾å¾å®¹æ使ç¨éçä¸æ¥ç代ç ï¼ä¸å¾å®¹æç使ç¨å¯¹è±¡æ 论å¨å®¹å¨å æä¸å¨å®¹å¨å ãä¾å¦ï¼Springç¨æ·ç»å¸¸é ç½®Jakarta Commons DBCPæ°æ®æºä¸ºä¸ä¸ªSpring beanï¼ä¸éè¦äºä»»ä½å®å¶ä»£ç å»åè¿ä»¶äºãæ们说ä¸ä¸ªIoC容å¨ä¸æ¯ä¾µå ¥æ§çï¼ä½¿ç¨å®å¹¶ä¸ä¼ä½¿ä½ ç代ç ä¾èµäºå®çAPIsãä»»ä½JavaBenaå¨Spring bean factoryä¸é½è½æ为ä¸ä¸ªç»ä»¶ã æååºè¯¥å¼ºè°çæ¯ï¼IoC ä¸åäºä¼ ç»ç容å¨çä½ç³»ç»æ( å¦EJB), åºç¨ä»£ç æå°ç¨åº¦çä¾é äºå®¹å¨ãè¿æå³çä½ çä¸å¡å¯¹è±¡å¯ä»¥æ½å¨ç被è¿è¡å¨ä¸åçIoC æ¡æ¶ä¸-æè å¨ä»»ä½æ¡æ¶ä¹å¤-ä¸éè¦ä»»ä½ä»£ç æ¹ã 以æçç»éªåä½ä¸ºSpringç¨æ·ï¼è¿å强è°IoCç»åºç¨ä»£ç 带æ¥ç好å¤æ¯ä¸å®¹æçã IoCä¸æ¯ä¸ä¸ªæ°æ¦å¿µï¼ä½æ¯å®å¨J2EEå¢ä½éé¢ååå°è¾¾é»éæ¶é´ã æä¸äºå¯ä¾éæ©çIoC 容å¨: notably, Apache Avalon, PicoContainer å HiveMind. Avalon ä¸ä¼æ为ç¹å«æµè¡çï¼å°½ç®¡å®å¾å¼ºå¤§èä¸æå¾é¿çåå²ãAvalonæ¯ç¸å½çéé级åå¤æçï¼å¹¶ä¸çèµ·æ¥æ¯æ°çIoC解å³æ¹æ¡æ´å ·ä¾µå ¥æ§ã PicoContaineræ¯ä¸ä¸ªè½»é级èä¸æ´å¼ºè°éè¿æé å¨è¡¨è¾¾ä¾èµæ§èä¸æ¯JavaBean å±æ§ã