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

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

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372626.shtml

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    php 批量更新死锁,php – 在尝试获取锁定时,哪个查询导致死锁;尝试重新启动事务...

    我无法弄清楚哪个Query在尝试获取锁定时导致死锁;尝试重新启动事务.我的mysql包装器有以下几行if (mysql_errno($this->conn) 1213) {$this->bug_log(0,"Deadlock. SQL:".$this->sql);}bug_log写入文件的位置.错误日志文件没有死锁错误,但/var/log/mysqld.…

    Task和BackTask

    一、总结性知识点&#xff1a; 1、Android应用运行时会创建任务Task&#xff0c;用于存放主窗口2、每一个任务包含一个堆栈数据结构&#xff0c;用于保存当前应用已创建的窗口对象&#xff0c;这个堆栈即回退栈BackStack3&#xff64; 位于回退栈顶的窗口会处于焦点状态4&#…

    Java面试题二

    1、public、private、protected、Friendly的区别与作用域 public,protected,friendly,private的访问权限如下&#xff1a; 关键字 当前类 包内 子孙类 包外 public √ √ √ √ protected…

    使用Spring Roo进行快速云开发–第1部分:Google App Engine(GAE)

    Spring Roo是在Java平台上提供快速应用程序开发的工具。 我已经解释了何时使用它&#xff1a; http : //www.kai-waehner.de/blog/2011/04/05/when-to-use-spring-roo 。 Spring Roo目前支持两种针对云计算的解决方案&#xff1a;Google App Engine&#xff08;GAE&#xff09;…

    mysql 重装,Windows系统中完全卸载MySQL数据库实现重装mysql

    一、在控制面板&#xff0c;卸载MySQL的所有组件控制面板——》所有控制面板项——》程序和功能&#xff0c;卸载所有和MySQL有关的程序二、找到你的MysQL安装路径&#xff0c;看还有没有和MySQL有关的文件夹&#xff0c;全删如果安装在C盘&#xff0c;检查一下C:\Program File…

    loadrunner 关联

    1、记住关联的位置&#xff08;之前&#xff09;&#xff0c;因为登录之前需要token&#xff0c;才能验证登录是否成功&#xff0c;所以&#xff0c;放在登录之前 转载于:https://www.cnblogs.com/zyp1/p/5692343.html

    网页上线后音频不能自动播放

    一、问题描述 开发环境谷歌浏览器本地测试通过&#xff0c;网站上线后的音乐不播放&#xff0c;而是自动下载&#xff1f; 开发环境safari浏览器中&#xff0c;音频不播放。 二、问题分析 用audio或者embed标签都有问题&#xff0c;为了节省用户的流量&#xff0c;安卓和ios都默…

    Akka STM –与STM Ref和Agent进行乒乓球比赛

    乒乓是一个经典示例&#xff0c;其中2个玩家&#xff08;或线程&#xff09;访问共享资源–乒乓球桌并在彼此之间传递Ball&#xff08;状态变量&#xff09;。 使用任何共享资源&#xff0c;除非我们同步访问&#xff0c;否则线程可能会遇到潜在的死锁情况。 PingPong算法非常简…

    c mysql二进制,MySQL运用connector C/C+读取二进制字段

    MySQL使用connector C/C读取二进制字段MySQL使用connector C/C读取二进制字段&#xff0c;两种方法&#xff1a;用getStringvector vec;while (pResultSet->next()){string str pResultSet->getString("data");vec.insert(vec.end(), str.begin(), str.end())…

    在下一个项目中不使用JavaDoc的5大原因

    JavaDoc对于框架和库的开发是绝对必要的&#xff0c;这些框架和库为其他框架&#xff08;例如Spring Framework&#xff0c;JDK&#xff09;提供了公共接口。 对于内部企业软件和/或产品开发&#xff0c;我有以下原因会在将来忽略“ 100&#xff05;JavaDoc策略”。 1&#xff…

    NPOI操作Excel辅助类

    /// <summary> /// NPOI操作excel辅助类 /// </summary> public static class NPOIHelper {#region 定义与初始化public static HSSFWorkbook workbook;[Flags]public enum LinkType{网址,档案,邮件,内容};private static void InitializeWorkbook(){if (workbook …

    JSP九大内置对象,七大动作,三大指令

    JSP之九大内置对象 隐藏对象入门探索 Servlet 和JSP中输出数据都需要使用out对象。Servlet 中的out对象是通过getWriter()方法获取的。而JSP中没有定义out对象却可以直接使用。这是因为out是JSO的内置隐藏对象。JSP中的常见的9个内置隐藏对象如下 out输出流对象 隐藏对象out是…

    matlab变步长的梯形公式,用变步长梯形法计算积分∫sinx/x*x的近似值(二分二次即可)...

    共回答了20个问题采纳率&#xff1a;90%题目没写全吧?现假定积分区间为[0,1],教材《数值分析》(华中科技大学出版)第87页,例题4.2就有详细的解答.貌似题目也有错?确定分母是【x^2】?现在附上该例题(分母是x)的全部解答过程&#xff1a;先对整个区间[0,1]使用梯形公式.对于函…

    使用Cloud SQL的Google App Engine全文搜索

    许多Google AppEngine开发人员一直在等待全文搜索功能&#xff0c;特别是来自网络上最大的搜索引擎Google。 很高兴看到Google团队正在努力&#xff0c;您可以在Google I / O 2011大会上签到&#xff1a; Bo Majewski和Ged Ellis进行的全文本搜索 。 据我所知&#xff0c;非常有…

    php 数组值sum,php sum数组值(如果特定列的值重复)

    我有一个阵列。我要检查是否有重复的费用,如果有,我要用相同的费用列汇总所有值。[12] > Array([type] > Other Miscellaneous Fees[fee] > 158[amount] > -22.56[code] > COL_AUDIO[feedesc] > COLLEGE AUDIO VISUAL FEE)[13] > Array([type] > Other…

    hdu-5734 Acperience(数学)

    题目链接&#xff1a; Acperience Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem DescriptionDeep neural networks (DNN) have shown significant improvements in several application domains including computer vision and…

    Ninject依赖注入(一)

    Ninject学习笔记&#xff08;一&#xff09; Ninject学习笔记&#xff08;一&#xff09;理解依赖注入DI概念什么是DI&#xff1f;DI是如何工作的&#xff1f;什么是DI容器使用Ninject如何使用NinjectNinject对象生命周期暂时范围单例范围线程范围请求范围自定义范围Ninject模块…

    我如何向团队解释依赖注入

    最近&#xff0c;我们公司开始开发基于Java的新Web应用程序&#xff0c;经过一些评估过程&#xff0c;我们决定使用Spring。 但是许多团队成员并不了解Spring和Dependency Injection的原理。 因此&#xff0c;我被要求给出一个速成班&#xff0c;介绍什么是Spring上的依赖注入和…

    可以添加自定义的Select控件

    1.控件dom <select name"WebSiteTarget" id"WebSiteTarget" class"w1" onchange"editable2(this);"><option value"-1">请选择城市</option><option>福州</option><option>厦门</op…

    innodb_io_capacity =innodb_lru_scan_depth*inoodb_buffer_pool_instances。与 checkpoint

    innodb_lru_scan_depth:每个缓冲池刷脏页的能力 innodb_io_capacity: iops inoodb_buffer_pool_instances8 :缓冲池的个数 .关系&#xff1a; innodb_io_capacity > innodb_lru_scan_depth * inoodb_buffer_pool_instances 转载于:https://www.cnblogs.com/zengkefu/…