9

我们有一个基于 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

任何帮助表示赞赏

4

3 回答 3

5

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

标准启动应用程序

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

Guice 模块配置

  @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 注入器并从中访问任何 bean

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

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

注意 1:默认情况下 Spring 使用 scope: Singleton和 guice: Prototype。如果您的 guice 组件未注释为@Singleton:每次创建 MySpringService 的新实例时,Option1 都会创建一个 ServiceA 的实例

Option2将 ServiceA 公开为具有 Singleton 范围的 bean。

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

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

于 2019-09-10T04:25:49.860 回答
0

看看spring-guice 项目。尤其请参阅有关访问模块的信息。由于它没有发布,我还没有尝试过,但我已经考虑复制一些代码。

我在粘贴中这样做的方法是让 Guice 组件由 Guice 提供支持,并@Bean直接使用 Guice 在 Spring 的 Java Config () 中检索它们,或者使用讨厌的静态服务定位器模式(即动态检索组件的静态方法来自古斯)。

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

于 2016-02-01T16:26:42.600 回答
-1

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

请参阅Spring:使用 JSR 330 标准注释Guice JSR-330 集成

于 2014-09-16T02:17:46.800 回答