覆盖spring的bean_Spring Bean覆盖策略
覆盖spring的bean
这些天,我越来越多地与Spring合作,而我发现的问题引起了人们的疑问。 本周,我的想法转向了bean覆盖,即用同一个名称注册多个bean。
对于简单的项目,则不需要这样做。 但是当围绕核心构建一个插件架构时,这可能是一个解决方案。 这是我发现并验证的有关bean覆盖的一些事实。
-
每个文件一个bean
-
Spring bean文件中的
id属性的类型为ID,这意味着在特定的Spring bean定义文件中,只有一个具有特定IDbean。 根据上下文片段的加载顺序覆盖bean
-
与类路径加载相反,在类路径加载中,第一个类比其他类在类路径上具有更高的优先级,它是最后使用的具有相同名称的最后一个 bean。 这就是为什么我称它为覆盖。 反转片段加载顺序可以证明这一点。
片段组装方法定义顺序
-
片段可以从Spring bean定义文件中的
<import>语句或通过外部组件( 例如 ,Web应用程序或测试类中的Spring上下文侦听器)进行汇编。 都定义了确定性顺序。
附带说明一下,尽管我以前在项目中使用过import语句(部分目的是为了利用IDE支持),但是经验告诉我,在重用模块时它可能会咬人:我赞成现在通过外部组件进行组装。 名字
-
Spring允许您在ID之外定义名称(这是将非法字符添加为ID的一种廉价方法)。 这些名称还会覆盖id。
别名
-
Spring使您可以定义现有bean的别名:这些别名也将覆盖id。
范围覆盖
-
这是真的意思: 通过覆盖bean,您还覆盖了scope 。 因此,如果原始bean具有指定的范围,而您没有指定相同的范围,那么很不幸:您可能只是更改了应用程序的行为。
id
您的开发团队可能不仅不知道,而且最后一个是不覆盖Bean的杀手级原因。 忘记对覆盖的bean进行作用域定义太容易了。
为了解决插件的体系结构,并且您不想走OSGi的道路,我建议使用我认为是KISS (还算优雅)的解决方案。
让我们将简单的Java属性与ProperyPlaceholderConfigurer结合使用。 Spring Beans的主要定义文件应为可被覆盖的bean定义占位符,并读取两个已定义的属性文件:一个包裹在核心JAR中,另一个包裹在预定义的路径中(最终由JVM属性设置)。
这两个属性文件具有相同的结构:标准的接口名称作为键,标准的实现名称作为值。 这样,您可以在内部属性文件中定义默认实现,并让使用程序在外部文件中覆盖它们(如有必要)。
另外一个优势是,它使用户免受Spring的攻击,因此他们不受框架的束缚。
可以在此处以Maven / Eclipse格式找到本文的源。
翻译自: https://blog.frankel.ch/spring-beans-overwriting-strategy/
覆盖spring的bean
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)