Spring和Guice一起使用,还是只用Spring?

24

我要从零开始创建一个新的Java Web应用程序。

虽然我对Spring框架没有太多经验,但我知道我想使用其中的一些功能,比如事务管理。

另一方面,我非常喜欢Guice进行依赖注入。

我知道Guice和Spring可以合作使用:http://www.jroller.com/mindcrime/entry/an_example_of_integrating_guice

但在设计我的应用程序之前,我想知道是否有人通过这种方法遇到了问题。

另外,我真正喜欢Guice的是你不需要XML配置文件,只需使用较短且更易于阅读的Java模块。在Spring上是否有任何替代XML配置文件的选择,类似于Guice?


2
如果你只需要依赖注入,我建议使用Guice。 - Chris Hinshaw
1
由于我需要比依赖注入更多的功能,所以我会选择Spring。感谢大家的回复。 - csalazar
5个回答

15

我认为光是Spring已经足够用于企业应用了。

Spring不需要XML!现代的Spring应用使用JavaConfig最小化配置。看一下Spring Boot Guides。整个Spring应用程序完全可以不用任何XML。

Guice不错,但非常有限。使用Spring可以非常轻松快捷地编写具有事务和持久性的Web应用程序或REST应用程序。使用Guice则更加复杂。


13
当你认为Guice有限时,你是非常错误的。使用Guice编写具有持久化和事务的REST应用程序与使用Spring一样容易(甚至更容易)。例如,官方提供了一个用于持久化和事务的扩展链接。而且,例如Resteasy可以直接支持Guice。 - Vladimir Matveev
1
当然,在Spring项目中除了DI容器之外,还提供了许多其他库,并且它们与该容器集成在一起。但是并不正确说Guice因此受到限制。 - Vladimir Matveev
2
看一下Guice主页:它是Java的轻量级依赖注入框架,并与Spring页面进行比较:帮助构建简单、可移植、快速和灵活的基于JVM的系统和应用程序。所有这些都是可能的,但Spring专注于构建企业应用程序。 - MariuszS

12

如果你刚开始学习,我建议使用https://github.com/spring-projects/spring-boot

它具有强大的自动配置功能,可以节省编写样板代码的时间。甚至由于嵌入式Tomcat,它还可以使你摆脱使用应用服务器的束缚。例如,实现简单的MVC控制器(可用作REST终端点)看起来像这样:

@Controller
@EnableAutoConfiguration
public class SampleController {

    @RequestMapping("/")
    @ResponseBody
    String home() {
        return "Hello World!";
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(SampleController.class, args);
    }
}
现在你可以执行java -jar your_package.jar,这就是全部。您还将获得事务管理、数据库集成等功能。可以在提到的链接中找到更多示例,特别是在https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples目录中。

7

Spring自两个大版本以来就已有基于Java的注解配置。您无需编写任何XML(甚至不需要web.xml!)

我曾经使用过Guice和Spring。对于需要DI的较小项目,Guice已足够。但是,如果您将要在Spring中使用MVC或事务支持,那么同样可以使用它的DI。 Guice也没有像Spring那样良好的配置文件支持 - 如果您想为本地开发、测试环境和生产环境设置单独的bean,则必须手动切换模块。


4

Google Guice几乎对于Spring的所有依赖注入概念都有1:1的映射,但它还有一些更酷的东西:

1. 全部使用Java。 Google Guice将所有配置都放在Java代码中,因此我们不需要处理任何xml配置或其他内容。

2. 更好的错误信息。 Guice具有一个拦截器,可以清理和重新抛出更好的堆栈跟踪。Spring只是输出所有内容。

3. 即时绑定(或隐式绑定)。这意味着如果您有一个零参数构造函数,则不需要进行额外的绑定,只需注入即可!如果您试图注入具有多个参数的构造函数,这些参数要么是零参数构造函数,要么已经被注入了,则无需进行额外的配置。同样,只需注入即可!

4. 急切/延迟注入 当您使用Spring进行注入时,它会说我将不注入任何东西或注入所有东西。Guice中有一个选项可以进行延迟注入,这意味着只创建我需要的依赖关系图的子部分。这意味着几件事情-您不需要那些奇怪的特殊Spring测试文件,Guice在测试中注入的速度更快,并且您可以在Eclipse中进行集成测试而几乎不需要设置!

5. 按类型绑定。这与Spring不同,Spring按名称绑定。在Spring中,如果您意外将两个实例绑定到相同的名称,则Spring将静默失败,并通过选择最后出现的绑定来使您更加困惑(呕)。Spring提供了“按类型绑定”的选项,但不要被它所欺骗-它的基础实现仍然是字符串。

来源:https://github.com/google/guice


Google Guice 包含所有的 Java 代码配置,因此我们不必处理任何 XML 配置或其他内容。Spring 也可以在 Java 代码中定义配置。 - scubbo
我不知道你说的2是什么意思,但是1、3和4是Spring和Guice共享的特性。至于5,对于大多数实际目的来说,在Spring中你会感觉像是按类型进行绑定。 - undefined

0
我还建议您查看HK2,这是一个轻量级的J2SE DI引擎。它类似于Guice和CDI,并具有许多您可能会感兴趣的可扩展性功能。它还通过双向桥接与Guice和Spring一起使用。您可以从这里开始了解HK2:http://hk2.java.net/。有关Guice桥接的信息在这里:https://hk2.java.net/2.2.0-b27/guice-bridge.html。有关Spring桥接的信息在这里:https://hk2.java.net/2.2.0-b27/spring-bridge.html
选择使用哪个DI提供程序很大程度上取决于您的应用程序所需的特殊功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接