Google Guice如何每次返回新实例?Spring与Guice注入差异咨询
在Guice中配置每次注入返回新实例(原型作用域)
嘿,作为同时上手Spring和Guice的新手,这个问题太正常了——毕竟俩框架的作用域配置语法确实有差异!在Guice里,要实现和Spring @Scope("prototype") 一样的“每次注入都返回新实例”的效果,主要有两种常用方式:
1. 使用@Prototype注解标注类
直接在你的目标类上加上Guice的@Prototype注解,这样Guice默认就会每次注入该类时创建新实例:
import com.google.inject.Prototype; @Prototype public class A { // 类的实现代码 }
之后不管是用@Inject注入到其他类,还是从Injector中获取A的实例,每次都会得到一个全新的对象。
2. 在Module中显式绑定原型作用域
如果不想在类上添加Guice专属注解,也可以在自定义的Module里通过绑定规则指定作用域:
import com.google.inject.AbstractModule; import com.google.inject.Scopes; public class MyAppModule extends AbstractModule { @Override protected void configure() { // 绑定A类到原型作用域 bind(A.class).in(Scopes.PROTOTYPE); } }
针对@Provides方法的情况
如果你是用@Provides方法来提供实例(类似Spring的@Bean),只需要给该方法加上@Prototype注解即可:
import com.google.inject.Provides; import com.google.inject.Prototype; public class MyAppModule extends AbstractModule { @Provides @Prototype A provideA() { return new A(); } }
补充说明
和Spring一样,Guice的默认作用域是单例(Singleton),所以如果不指定原型作用域,每次注入都会拿到同一个实例。而Scopes.PROTOTYPE(或@Prototype注解)对应的就是Spring中@Scope("prototype")的行为:每次请求实例时都会创建新对象。
内容的提问来源于stack exchange,提问作者user3201336
相关产品推荐
相关产品推荐

