Java 作为带有Guice的单例的Helper类
我正在学习谷歌Guice。 我了解如何将接口绑定到其实现 现在,我有了以下帮助器类:Java 作为带有Guice的单例的Helper类,java,guice,Java,Guice,我正在学习谷歌Guice。 我了解如何将接口绑定到其实现 现在,我有了以下帮助器类: class PersonHelper { public static FakeDatabaseConfiguration dbConfig; public PersonHelper(){ if (dbConfig == null){ dbConfig = new FakeDatabaseConfiguration(); dbConfig.setHo
class PersonHelper {
public static FakeDatabaseConfiguration dbConfig;
public PersonHelper(){
if (dbConfig == null){
dbConfig = new FakeDatabaseConfiguration();
dbConfig.setHost('127.0.0.1');
dbConfig.setPort('3306');
dbConfig.setUsername('root');
dbConfig.setPassword('root');
}
}
public List<Person> getPersons(){
FakeResult fakeResult = dbConfig.executeSQL("select * from Person");
return fakeResult.asList();
}
}
类PersonHelper{
公共静态FakeDatabaseConfiguration dbConfig;
公共人事助理(){
if(dbConfig==null){
dbConfig=new FakeDatabaseConfiguration();
setHost('127.0.0.1');
dbConfig.setPort('3306');
dbConfig.setUsername('root');
dbConfig.setPassword('root');
}
}
公众人士名单{
FakeResult FakeResult=dbConfig.executeSQL(“选择*来自个人”);
返回fakeResult.asList();
}
}
今天,我这样使用它:
PersonHelper personHelper = new PersonHelper();
List<Person> personsList = personHelper. getPersons();
@Singleton // Could also be in your module or @Provides method.
class PersonHelper {
private FakeDatabaseConfiguration dbConfig;
public PersonHelper(){
dbConfig = new FakeDatabaseConfiguration();
dbConfig.setHost('127.0.0.1');
dbConfig.setPort('3306');
dbConfig.setUsername('root');
dbConfig.setPassword('root');
}
public List<Person> getPersons(){
FakeResult fakeResult = dbConfig.executeSQL("select * from Person");
return fakeResult.asList();
}
}
PersonHelper PersonHelper=newpersonhelper();
List personlist=personHelper。getPersons();
我很确定有办法让这门课更好
问题:如何使用Guice将这个类作为一个单例,这样我就不会在每个实例上延迟加载dbConfig
变量?
(我读到有一个@Singleton
注释,但它在Guice中被视为一个范围。)
问候请查看这是否有帮助。Singleton
部分可能适合您。将其作为作用域正是您想要的:作用域有效地告诉Guice何时允许重用已创建的相同对象,对于@Singleton
,答案是“始终”
如果您要这样列出该类:
PersonHelper personHelper = new PersonHelper();
List<Person> personsList = personHelper. getPersons();
@Singleton // Could also be in your module or @Provides method.
class PersonHelper {
private FakeDatabaseConfiguration dbConfig;
public PersonHelper(){
dbConfig = new FakeDatabaseConfiguration();
dbConfig.setHost('127.0.0.1');
dbConfig.setPort('3306');
dbConfig.setUsername('root');
dbConfig.setPassword('root');
}
public List<Person> getPersons(){
FakeResult fakeResult = dbConfig.executeSQL("select * from Person");
return fakeResult.asList();
}
}
@Singleton//也可能位于您的模块或@Provides方法中。
类PersonHelper{
私有FakeDatabaseConfiguration dbConfig;
公共人事助理(){
dbConfig=new FakeDatabaseConfiguration();
setHost('127.0.0.1');
dbConfig.setPort('3306');
dbConfig.setUsername('root');
dbConfig.setPassword('root');
}
公众人士名单{
FakeResult FakeResult=dbConfig.executeSQL(“选择*来自个人”);
返回fakeResult.asList();
}
}
然后类本身就变成了一个单体。只要实例化该类,就会创建FakeDatabaseConfiguration,但对于通过Guice进行的所有访问,这只会发生一次
当然,这些都不适用于直接的构造函数调用,比如
newPersonHelper()
,但除了少数例外,Guice只擅长保证它提供的对象。Guice可以控制的任何访问,包括通过getInstance
或@Inject
-注释字段和构造函数,将只看到PersonHelper(因此FakeDatabaseConfiguration)创建一次。首先,在您的模块中,您必须声明一个提供程序(FakeDatabaseConfigurationProvider
)。如上所述,这是注入配置对象的最佳方式。
然后,将助手类声明为单例
,并将其绑定到模块中。
这将允许您的助手类按如下方式使用:
public class SomeClass{
@Inject
private PersonHelper personHelper;
...
public void someMethod(){
...
List<Person> personsList = personHelper.getPersons();
..
}
}
我确实读过那个答案,但我无法根据我的情况来调整它。你能用代码解释一下你的理解吗(如果可能的话,我的代码)?我认为在使用DI时避免使用“新”是一个很好的“经验法则”。在这种情况下:为什么要创建一个创建DB配置的单例“助手”?直接在模块中提供DbConfig,然后实现一个“提供程序”,该提供程序将注入配置并在其“get”方法中返回列表。这样,设置完全由模块管理,您不再需要助手。@Jan同意删除
new
,但强烈不同意通过使其返回值直接可注入来消除所有助手。对于事实上是提供者的助手,当然可以,但我不认为在这里是这样的,尤其是在涉及数据库调用和模型对象列表的情况下。仍然有足够的空间为单身助手注射,特别是如果他们被模拟测试。