将Guice组件集成到Spring应用程序中

时间:2013-09-16 10:58:09

标签: spring guice

我们有一个基于Spring框架的应用程序,需要集成使用Google Guice构建的组件。

有人可以就如何做到这一点给我们一些建议吗?

我们遇到了以下链接,展示了如何将Spring集成到Guice中,但我们需要反过来:

http://google-guice.googlecode.com/git/javadoc/com/google/inject/spring/SpringIntegration.html

http://www.jroller.com/mindcrime/entry/an_example_of_integrating_guice

感谢任何帮助

3 个答案:

答案 0 :(得分:1)

不需要特殊的框架或依赖项即可将guice组件集成到spring-boot。

标准启动应用

    @SpringBootApplication
    public class App {
       SpringApplication.run(App.class, appArgs);
    }

指导模块配置

  @Configuration
  public class GuiceBeanConfig {

    private final Injector injector;

    // guice modules are initialized before the spring context completes 
    {
        injector = Guice.createInjector(
                new MyModuleA(),
                new MyModuleB()
        );
    }

    /**
     * Option1: can expose injector as a Spring Bean.
     */
    @Bean
    public Injector injector() {
        return injector;
    }


    /**
     * Option2: expose specific component as a Spring Bean.
     */
    @Bean
    public MyServiceA serviceA() {
        return injector.getInstance(ServiceA.class);
    }
}

作为常规spring bean自动连接到服务组件中。

  • 选项1:自动连接guice注入器并从中访问任何

     @Service
     public class MySpringService {
    
        private final ServiceA serviceA;  
    
        MySpringService (Injector i){
           serviceA = injector.getInstance(ServiceA.class)
        }
    
        public void callServiceA() {
            serviceA.doSomething();
        }
    
      }
    
  • 选项2:自动连线特定的豆子

    @Service
    public class MySpringService {
    
      private final ServiceA serviceA; 
    
      MySpringService (ServiceA s){
          serviceA = s;
      }
    
      public void callServiceA() {
          serviceA.doSomething();
      }
    
    }
    

注意1: 默认情况下,Spring使用范围: Singleton 和guice: Prototype 。 如果您的guice组件未标注为 @Singleton
每次创建MySpringService的新实例时, Option1 都会创建ServiceA的实例。
Option2 而是将ServiceA公开为具有作用域Singleton的bean。

Singleton与原型:如果组件/服务是线程安全的,则不保持状态,因此更好的选择是Singleton。更好的性能,更少的GC工作。

注意2: 如果进行构造函数注入,Spring-boot不需要使用@Autowire注释。

答案 1 :(得分:0)

查看spring-guice project。特别要查看有关accessing modules的信息。我没有尝试过,因为它没有发布,但我已经考虑过复制一些代码了。

我在粘贴中完成此操作的方法是让Guice组件由Guice提供支持,并使用Guice直接在Spring的Java Config(@Bean)中检索它们或使用讨厌的静态服务定位器模式(即从Guice动态检索组件的静态方法)。

无论采用何种方法,我遇到的最大问题是,因为你有竞争性的生命周期,所以首先要弄清楚什么是靴子(理论上,spring-guice项目会解决这个问题)。

答案 2 :(得分:-1)

Spring和Guice都支持JSR 330: Dependency Injection for Java。如果您需要的Guice组件是使用JSR 330注释定义的,或者如果您可以访问代码并且可以更改注释,那么您应该能够在Spring托管bean中使用它。

请参阅Spring: Using JSR 330 Standard AnnotationGuice JSR-330 Integration