将 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 注释,以防您进行构造函数注入。