Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Guice组件集成到Spring应用程序中_Spring_Guice - Fatal编程技术网

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

将Guice组件集成到Spring应用程序中,spring,guice,Spring,Guice,我们有一个基于Spring框架的应用程序,需要集成一个使用GoogleGuice构建的组件 有谁能给我们一些建议如何做到这一点 我们遇到了以下链接,这些链接展示了如何将Spring集成到Guice中,但我们需要的是另一种方式: 任何帮助都将受到Spring和Guice支持的感谢。如果您需要的Guice组件是使用jsr330注释定义的,或者您可以访问代码并更改注释,那么您应该能够在Spring管理的bean中使用它 请参见和查看。具体请参见有关的信息。我没有尝试过,因为它没有发布,但我已经考虑

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

有谁能给我们一些建议如何做到这一点

我们遇到了以下链接,这些链接展示了如何将Spring集成到Guice中,但我们需要的是另一种方式:


任何帮助都将受到Spring和Guice支持的感谢。如果您需要的Guice组件是使用jsr330注释定义的,或者您可以访问代码并更改注释,那么您应该能够在Spring管理的bean中使用它

请参见和

查看。具体请参见有关的信息。我没有尝试过,因为它没有发布,但我已经考虑复制一些代码

我在粘贴中这样做的方式是,让Guice为Guice组件提供动力,并直接使用Guice在Spring的Java配置(
@Bean
)中检索它们,或者使用讨厌的静态服务定位器模式(即从Guice动态检索组件的静态方法)


不管采用哪种方法,我遇到的最大问题是,由于存在相互竞争的生命周期(理论上,SpringGuice项目将解决这一问题),所以我首先要弄清楚什么是boots

将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);
    }
}
将服务组件作为常规SpringBean自动连接。

  • 选项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:autowire特定bean

    @Service
    public class MySpringService {
    
      private final ServiceA serviceA; 
    
      MySpringService (ServiceA s){
          serviceA = s;
      }
    
      public void callServiceA() {
          serviceA.doSomething();
      }
    
    }
    
注1: 默认情况下,Spring使用作用域:Singleton和guice:Prototype。 如果您的GUI组件未注释为@Singleton
选项1每次创建MySpringService的新实例时,都会创建ServiceA的实例。
选项2将ServiceA公开为作用域为单例的bean

Singleton vs Prototype:如果组件/服务是线程安全的,不保持状态,那么更好的选择是Singleton。性能更好,GC的工作量更少

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

这不是很有帮助。那么所有这些多绑定器、提供者等呢。?