我们有一个基于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
感谢任何帮助
答案 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 Annotation和Guice JSR-330 Integration