我们有一个基于 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
任何帮助表示赞赏
将 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 使用作用域:辛格尔顿和指导:原型。
如果您的 guice 组件未注释为@辛格尔顿 :
Option1每次创建 MySpringService 的新实例时,都会创建一个 ServiceA 实例。
Option2相反,将 Service 公开为具有 Singleton 范围的 bean。
单例与原型:如果你的组件/服务是线程安全的,不保持状态,更好的选择是单例。更好的性能,更少的 GC 工作。
笔记2:
如果您进行构造函数注入,Spring-boot 不需要使用 @Autowire 注释。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)