guice spring

根据弹簧对象的名称识别它们
不管使用XML还是Java配置都没有关系,Spring范围大致类似于Map <String,Object>结构。 这意味着您不能有两个名称相同的对象 。 为什么这是一件坏事? 如果您的大型应用程序具有许多@Configuration类或XML文件,则很容易意外地两次使用相同的名称。
最糟糕的部分是,将它们与多个对象一起使用时,它们会默默地相互覆盖,直到在ApplicationContext中仅实际保留一个对象为止。 这些对象也可以具有不同的类型,而声明顺序才是真正确定哪个对象获胜的因素。 这里的问题是,如果要基于Spring创建可重用的模块,则基本上将被迫在名称或其他名称中使用前缀,以确保不会出现名称冲突。
Guice对象根据其类别进行识别
Guice范围基本上类似于Map <Class <?>,Object>结构。 这意味着如果不使用额外的元数据(例如,限定词), 就不能拥有两个相同类型的对象 。 这种设计选择各有利弊,但总的来说,我认为这是比较明智​​的选择。 如果创建可重用的模块,则必须确保不导出任何通用类型的对象(例如String)。 使用基于类型的作用域,您始终可以为常见类型创建一个包装的类,而使用基于名称的作用域,您将始终不得不根据幸运的猜测使用唯一的名称。 Guice还具有PrivateModules,因此您可以对所有注入使用Guice,但仅导出范围中的某些对象。  
范例程式码
这是一个Spring应用程序的幼稚示例,由于静默Bean覆盖而中断了运行时。

Main.java

此类实例化应用程序上下文,注册配置类并尝试从上下文中获取MyBean。

package springbreak;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class Main {public static void main(String[] args) {AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();ctx.register(GoodConfig.class);ctx.register(EvilConfig.class);ctx.refresh();ctx.start();System.out.println(ctx.getBean(MyBean.class).getValue());ctx.stop();}
}

MyBean.java

这只是我们期望从应用程序上下文中获得的一种示例类型的Bean。

package springbreak;public interface MyBean {String getValue();
}

GoodConfig.java

这是一个导出MyBean的配置类

package springbreak;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class GoodConfig {private static class MyBeanImpl implements MyBean {public String getValue() {return "I'm a bean";}}@Beanpublic MyBean myBean() {return new MyBeanImpl();}}

EvilConfig.java

此配置类导出名为myBean的String。 这不是一个非常现实的示例,但显示了基本思想。

package springbreak;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class EvilConfig {@Beanpublic String myBean() {return "I'm a string!";}}
分析例子
您可以猜测运行示例时会发生什么吗? 这是基本思想:
  1. GoodConfig导出名称为“ myBean”的MyBeanImpl。
  2. 即使类型不匹配 ,EvilConfig 也会导出一个名称为“ myBean”的字符串,以替换GoodConfig中的字符串
  3. Main获得NoSuchBeanDefinitionException“未定义[springbreak.MyBean]类型的唯一bean”
因此,基本上将MyBeanImpl替换为String,并且不会实现MyBean的bean。 最糟糕的部分是, 如果您颠倒@Configuration类的注册顺序,该代码将起作用,因为然后String将被MyBeanImpl替换。 现在,假设您有20个封装良好的模块,这些模块的名称可能会发生冲突……我在这种情况下几次尝试调试问题时都碰壁了。
Spring(从3.0.6版开始)无法更改@Configuration类导出的bean的命名。 如果要创建可安全重用的模块,则必须在导出Bean的方法中使用某种完全限定的名称(例如goodConfigMyBean,evilConfigMyBean)。
我喜欢Spring(尤其是非DI容器部件),但是在新项目中,我将拒绝使用从根本上被破坏的库。 是的,两次使用相同的名称是开发人员错误,但是任何容易发生此类错误的库都可以认为比尝试最小化这些错误的替代方法更糟。

参考: Spring vs Guice: Jawsy Solutions技术博客博客上我们JCG合作伙伴 Joonas Javanainen 的一个重要差异 。

翻译自: https://www.javacodegeeks.com/2012/06/spring-vs-guice-one-critical-difference.html

guice spring

guice spring_Spring vs Guice:重要的一个关键区别相关推荐

  1. Spring vs Guice:重要的一个关键区别

    根据弹簧对象的名称识别它们 不管使用XML还是Java配置都没有关系,Spring范围大致类似于Map <String,Object>结构. 这意味着您不能有两个名称相同的对象 . 为什么 ...

  2. Guice——轻量级注解Guice简单之美

    Guice是谷歌推出的一个轻量级依赖注入框架,帮助我们解决Java项目中的依赖注入问题.如果只想在项目中使用依赖注入,这时候我们可以考虑使用Guice,不需要使用Spring那个庞然大物.本文参考了G ...

  3. HTML中的form表单有一个关键属性 enctype

    HTML中的form表单有一个关键属性 enctype=application/x-www-form-urlencoded 或multipart/form-data. 1.enctype=" ...

  4. 薄膜则是集成光学系统一个关键的组成部分,LN薄膜和SiOz层形成的高折射率差对光形成限制作用-供应流延聚丙烯蒸镀金属(MCP)/二氧化硅/氧化铝薄膜定制

    从20世纪末开始集成光学得到了迅速的发展,它可以实现将多个光学元件集成在同一块芯片材料上,形成一个结构复杂.功能强大的微型/小型器件,以实现一种或多种光学功能,在传感.通信/信号传输.环境检测等领域都 ...

  5. 【数据科学家】什么是数据科学家? 一个关键的数据分析角色和一个利润丰厚的职业...

    数据科学家的角色因行业而异,但有一些共同的技能.经验.教育和培训可以帮助你在数据科学职业生涯中占据一席之地. 什么是数据科学家? 数据科学家是分析数据专家,他们使用数据科学从大量结构化和非结构化数据中 ...

  6. 公司停电,程序员去网吧写代码;iPhone 14将于北京时间9月8日发布;GitLab修复一个关键远程代码执行漏洞|极客头条

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...

  7. 公司停电,程序员去网吧写代码;iPhone 14将于北京时间9月8日发布;GitLab修复一个关键远程代码执行漏洞|极客头条...

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...

  8. html4与html5效果,浅谈HTML5与HTML4的10个关键区别

    HTML5是HTML标准的下一个版本.越来越多的程序员开始HTML5来构建网站.如果你同时使用HTML4和HTML5的话,你会发现用HTML5从头构建,比从HTML4迁移到HTML5要方便很多.虽然H ...

  9. 内存和外存的主要区别_内存与外存的关键区别有哪些?

    易失性VS非易失性.内存,例如随机存取内存(RAM),是具有易失性的.这意味着当系统断电时,数据就会丢失.与之相反,外部存储是非易失性的,因此即使没有电源,它也能保存数据. 性能和容量.在大多数情况下 ...

最新文章

  1. 关于子业之间相互取得元素或者方法
  2. SQL Server 2012高可用性组
  3. uml里的extend和include_用例图中包含(include)扩展(extend)和泛化(generalization)关系详解...
  4. 数据中心产品化的蜕变
  5. mysql 触发器 for each row 理解_MySQL触发器中的“ FOR EACH ROW”如何工作?
  6. 人脑、思维与认知的研究
  7. PP点点通畸形文件溢出漏洞0Day
  8. html 字体围绕图片效果
  9. .rpt文件内容读取java_Java项目读取配置文件时,找不到指定的文件???
  10. hbase基本操作命令及练习
  11. 什么是欧代?什么是欧盟代理人?
  12. Install Debian (Etch/testing) in a USB stick 在U 盘中安装 Debian(Etch/testing)(
  13. 计算机的发明还不到一百年 英语,考研英语作文万能句子25个.doc
  14. steam游戏的计算机要求,steam游戏怎么看配置是否符合,steam不要求配置的游戏
  15. C#实例练习3:程序流程控制(2)
  16. 【考研经验】19年华东师范大学计算机专硕考研经验(初试+复试)分享!专业课140分!...
  17. BOSS和拉勾竞品分析
  18. 本人开始提供NOD32 相关升级及咨询服务
  19. OpenWrt设置.端口转发和远程访问路由器
  20. C6678多核DSP开发——hello world

热门文章

  1. 到底什么是跨域?附解决方案
  2. jps命令:查看Java进程等详细信息
  3. 命令模式的两种不同实现
  4. 树层级处理上万条数据优化!
  5. A configuration error occurred during startup.Please verify the preference field with the prompt: To
  6. 如何通过反射将字符串转换为类
  7. JS生成x到y的随机数
  8. 用赫夫曼树进行文件解压
  9. 方舟非主机服务器无限距离,方舟非专业服务器距离限制怎么解除 | 手游网游页游攻略大全...
  10. 转:常用的几种加密算法以及java实现