Scopes
优质
小牛编辑
127浏览
2023-12-01
每当Guice提供一个值作为其默认行为时,它都会返回一个新实例。 它可以通过范围进行配置。 以下是Guice支持的范围 -
@Singleton - 应用程序生命周期的单个实例。 @Singleton对象需要是线程安全的。
@SessionScoped - Web应用程序特定会话的单个实例。 @SessionScoped对象需要是线程安全的。
@RequestScoped - Web应用程序的特定请求的单个实例。 @RequestScoped对象不需要是线程安全的。
应用范围的方法
以下是应用范围的方法。
在class
@Singleton
class SpellCheckerImpl implements SpellChecker {
public SpellCheckerImpl(){}
@Override
public void checkSpelling() {
System.out.println("Inside checkSpelling." );
}
}
在配置级别
bind(SpellChecker.class).to(SpellCheckerImpl.class).in(Singleton.class);
在方法级别
@Provides @Singleton
public SpellChecker provideSpellChecker() {
String dbUrl = "jdbc:mysql://localhost:5326/emp";
String user = "user";
int timeout = 100;
SpellChecker SpellChecker = new SpellCheckerImpl(dbUrl, user, timeout);
return SpellChecker;
}
例子 (Example)
让我们看看课堂上的范围。
结果使用@Singleton Annotation
创建一个名为GuiceTester的java类。
GuiceTester.java
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.Singleton;
public class GuiceTester {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new TextEditorModule());
SpellChecker spellChecker = new SpellCheckerImpl();
injector.injectMembers(spellChecker);
TextEditor editor = injector.getInstance(TextEditor.class);
System.out.println(editor.getSpellCheckerId());
TextEditor editor1 = injector.getInstance(TextEditor.class);
System.out.println(editor1.getSpellCheckerId());
}
}
class TextEditor {
private SpellChecker spellChecker;
@Inject
public void setSpellChecker(SpellChecker spellChecker) {
this.spellChecker = spellChecker;
}
public TextEditor() { }
public void makeSpellCheck() {
spellChecker.checkSpelling();
}
public double getSpellCheckerId() {
return spellChecker.getId();
}
}
//Binding Module
class TextEditorModule extends AbstractModule {
@Override
protected void configure() {
bind(SpellChecker.class).to(SpellCheckerImpl.class);
}
}
interface SpellChecker {
public double getId();
public void checkSpelling();
}
@Singleton
class SpellCheckerImpl implements SpellChecker {
double id;
public SpellCheckerImpl() {
id = Math.random();
}
@Override
public void checkSpelling() {
System.out.println("Inside checkSpelling." );
}
@Override
public double getId() {
return id;
}
}
编译并运行该文件,您可能会看到以下输出具有相同的数字。
0.3055839187063575
0.3055839187063575
没有@Singleton注释的结果
创建一个名为GuiceTester的java类。
GuiceTester.java
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
public class GuiceTester {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new TextEditorModule());
SpellChecker spellChecker = new SpellCheckerImpl();
injector.injectMembers(spellChecker);
TextEditor editor = injector.getInstance(TextEditor.class);
System.out.println(editor.getSpellCheckerId());
TextEditor editor1 = injector.getInstance(TextEditor.class);
System.out.println(editor1.getSpellCheckerId());
}
}
class TextEditor {
private SpellChecker spellChecker;
@Inject
public void setSpellChecker(SpellChecker spellChecker) {
this.spellChecker = spellChecker;
}
public TextEditor() { }
public void makeSpellCheck() {
spellChecker.checkSpelling();
}
public double getSpellCheckerId() {
return spellChecker.getId();
}
}
//Binding Module
class TextEditorModule extends AbstractModule {
@Override
protected void configure() {
bind(SpellChecker.class).to(SpellCheckerImpl.class);
}
}
interface SpellChecker {
public double getId();
public void checkSpelling();
}
class SpellCheckerImpl implements SpellChecker {
double id;
public SpellCheckerImpl() {
id = Math.random();
}
@Override
public void checkSpelling() {
System.out.println("Inside checkSpelling." );
}
@Override
public double getId() {
return id;
}
}
编译并运行该文件,您可能会看到以下不同数字的输出。
0.556007079571739
0.22095011760351602