如果我有接口Validator和这个接口的多个实现.如何使用Guice注入任何多个实现?现在我知道我可以使用以下代码注入一个,但它只允许一个实现:
public class MyModule extends AbstractModule {
@Override
protected void configure() {
bind(Validator.class).to(OneOfMyValidators.class);
}
}
Run Code Online (Sandbox Code Playgroud)
我想做的是:
Validator v1 = injector.getInstance(Validator1.class);
Validator v2 = injector.getInstance(Validator2.class);
Run Code Online (Sandbox Code Playgroud)
有可能吗?
在guice中,@ Singleton范围不涉及Singleton模式.
根据"Dhanji"的"依赖注入"一书:
很简单,单例的上下文就是注入器本身.单身的寿命与注射器的寿命有关(如图5.8所示).因此,每个注射器只创建一个单例实例.重要的是要强调最后一点,因为多个喷射器可能存在于同一应用中.在这种情况下,每个注入器将保存单例范围对象的不同实例.

是否可以通过多个模块和多个喷射器共享同一个Singleton实例?
我想使用google guice在我的应用程序的所有类中提供属性.我定义了一个模块,它加载和绑定属性文件Test.properties.
Property1=TEST
Property2=25
Run Code Online (Sandbox Code Playgroud)
package com.test;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
import com.google.inject.AbstractModule;
import com.google.inject.name.Names;
public class TestConfiguration extends AbstractModule {
@Override
protected void configure() {
Properties properties = new Properties();
try {
properties.load(new FileReader("Test.properties"));
Names.bindProperties(binder(), properties);
} catch (FileNotFoundException e) {
System.out.println("The configuration file Test.properties can not be found");
} catch (IOException e) {
System.out.println("I/O Exception during loading configuration");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用一个主类,我创建一个注入器来注入属性.
package com.test;
import com.google.inject.Guice;
import com.google.inject.Injector;
public class Test {
public …Run Code Online (Sandbox Code Playgroud) 我听说过" @ImplementedBy是邪恶的",理由是它打破了DI概念并让界面意识到它的实现者.
在某些情况下可能会出现这种情况,但我经常发现它只会导致更清晰的代码(没有很长的模块可以维护),而不会真正伤害过程中的任何内容.
作为语用学,而不是纯粹主义者,你认为什么时候使用@ImplementedBy是值得的?
请提供一些有关如何TypeLiteral使用Google Guice或Java EE的基本信息,如果使用简单的代码解释它将会非常有用,提前感谢
我有一个简单的jane servlets Web应用程序,我的一些类有以下注释:
@Controller
@RequestMapping(name = "/blog/")
public class TestController {
..
}
Run Code Online (Sandbox Code Playgroud)
现在,当我的servlet应用程序启动时,我想获得所有具有@Controller注释的类的列表,然后获取@RequestMapping注释的值并将其插入字典中.
我怎样才能做到这一点?
我也使用Guice和Guava,但不确定是否有任何与注释相关的助手.
我正在构建一个使用Linux,Apache,Tomcat,Wicket,JPA/Hibernate和MySQL的新Web应用程序.我的主要需求是依赖注入,Spring和Guice都可以做得很好.我想我需要Spring和JTA带来的事务支持,但我不确定.
该网站可能有大约20页,我不希望有大量的流量.
我应该使用Spring还是Guice?
随意提问和后续问题,我会尽力更新.
我想问一下有什么区别
bindConstant().annotatedWith(Names.named("keepAliveInterval")).to(60);
Run Code Online (Sandbox Code Playgroud)
和
bind(Integer.TYPE).annotatedWith(Names.named("keepAliveInterval")).toInstance(60);
Run Code Online (Sandbox Code Playgroud)
我想用Names.bindProperties(binder(),prop)加载我的所有配置属性; 在我的模块中,我发现它使用后者来绑定属性.
感谢和问候
马雷克
我们尝试用Guice重构一个项目.我们的想法是将所有语言界面绑定到一个像法语或波兰语这样的混合对象.
我们有一个绑定模块:
public class StandardModule extends AbstractModule {
@Override
protected void configure() {
bind(Language.class).to(Polish.class);
}
}
Run Code Online (Sandbox Code Playgroud)
以及使用此注入对象的classe(AboutDialog.java):
@Inject Language language;
public AboutDialog(JFrame parent) {
super(parent, "", true);
this.language=language;
this.setTitle(language.getLanguageInUse().getString("AboutDialog.title"));
this.parent = parent;
try {
jbInit();
} catch (Exception e) {
e.printStackTrace();
}
pack();
}
Run Code Online (Sandbox Code Playgroud)
我们有结果:
java.lang.NullPointerException at net.sf.jmoney.gui.AboutDialog.<init>(AboutDialog.java:67)
Run Code Online (Sandbox Code Playgroud)
第67行是:
this.setTitle(language.getLanguageInUse().getString("AboutDialog.title"));
Run Code Online (Sandbox Code Playgroud)
我们的界面是:
public interface Language {
public ResourceBundle getLanguageInUse();
}
Run Code Online (Sandbox Code Playgroud)
波兰语课程是:
public class Polish implements Language {
private ResourceBundle languageInUse;
public Polish() {
languageInUse = …Run Code Online (Sandbox Code Playgroud) 我有一个AssistedInject的问题.我按照此链接上的说明 https://github.com/google/guice/wiki/AssistedInject 但是当我运行我的应用程序时出现错误:
ERROR [2015-04-23 14:49:34,701] com.hubspot.dropwizard.guice.GuiceBundle: Exception occurred when creating Guice Injector - exiting
! com.google.inject.CreationException: Unable to create injector, see the following errors:
!
! 1) A binding to java.lang.String annotated with @com.google.inject.assistedinject.Assisted(value=) was already configured at com.demo.migrator.service.democlient.DemoAPIFactory.create().
! at com.demo.migrator.service.democlient.DemoAPIFactory.create(DemoAPIFactory.java:1)
! at com.google.inject.assistedinject.FactoryProvider2.initialize(FactoryProvider2.java:577)
! at com.google.inject.assistedinject.FactoryModuleBuilder$1.configure(FactoryModuleBuilder.java:335) (via modules: com.demo.migrator.MigrationModule -> com.google.inject.assistedinject.FactoryModuleBuilder$1)
Run Code Online (Sandbox Code Playgroud)
这是我的模块配置:
install(new FactoryModuleBuilder()
.implement(DemoAPI.class, DemoClient.class)
.build(DemoAPIFactory.class));
Run Code Online (Sandbox Code Playgroud)
这是我工厂的样子:
public interface DemoAPIFactory {
DemoAPI create(String _apiKey, String _secretKey);
}
Run Code Online (Sandbox Code Playgroud)
接口声明如下:
public interface DemoAPI {
//list of interface methods …Run Code Online (Sandbox Code Playgroud)