我在我的IDE中通过常春藤获得了google.inject包,但是,我没有看到pacakage
com.google.inject.multibindings.Multibinder
Run Code Online (Sandbox Code Playgroud)
这里引用了哪个
我想知道---也许有多个guice转发我应该从中拉出来?
但是,我会看到以下软件包:com.google.inject - > binder/internal/matcher/util
我的常春藤定义:
<dependency org="com.google.inject" name="guice" rev="3.0" conf="*->*,!javadoc"/>
Run Code Online (Sandbox Code Playgroud) 我希望在课堂上有一个提供者成员,当'get'调用时,每次都会给我一个新对象.我怎样才能做到这一点?
public class GuiceInjectionTest
{
@Inject
Provider<MyClass> provider;
public Provider<MyClass> get()
{
//I want a new instance every time here that is injected by guice
return provider.get()
}
}
Run Code Online (Sandbox Code Playgroud)
注意我希望这个新实例由Guice注入,所以我不能new MyClass()在提供者实现中创建一个.
Guice有办法简单地让我创建具有不同值/参数的多个对象/ bean吗?例如,假设我有Triangle类,我希望在配置中创建多个三角形,一个带参数lengh = 6,一个带length = 5,另一个没有参数.如果我尝试这样的事情:
bind(Triangle.class).to(IsoTriangle.class);
bind(Triangle.class).toInstance(new Triangle(6));
Run Code Online (Sandbox Code Playgroud)
我收到错误:
A binding to test.Triangle was already configured at test.Configuration.configure(Configuration.java:14).
at test.Configuration.configure(Configuration.java:15)
如果我尝试在main方法中调用两个Triangle实例,如:
Triangle tr = injector.getInstance(Triangle.class);
Triangle tr2 = injector.getInstance(Triangle.class);
Run Code Online (Sandbox Code Playgroud)
第二个实例被忽略了,因为我没有看到第二次使用它.
我读到有这样的事情:
class LegModule extends PrivateModule {
private final Class<? extends Annotation> annotation;
LegModule(Class<? extends Annotation> annotation) {
this.annotation = annotation;
}
@Override protected void configure() {
bind(Leg.class).annotatedWith(annotation).to(Leg.class);
expose(Leg.class).annotatedWith(annotation);
bindFoot();
}
abstract void bindFoot();
}
public static void main(String[] args) {
Injector injector = …Run Code Online (Sandbox Code Playgroud) 如果我尝试构造单例的新实例,Guice是否可能抛出异常?
例如:
public class MyModule extends AbstractModule {
@Override
protected void configure() {
bind(MySingleton.class).in(Singleton.class);
}
}
@Singleton
public class MySingleton {
MySingleton() { /* ... */ }
}
public class RightWay {
public void withInjector() {
Injector injector = Guice.createInjector(new MyModule());
MySingleton mySingleton = injector.getInstance(MySingleton.class);
}
}
public class AnotherRightWay {
private final MySingleton mySingleton;
@Inject
public AnotherRightWay(MySingleton mySingleton) {
this.mySingleton = mySingleton;
}
}
public class TheWrongWay {
public void directInstantiation() {
MySingleton mySingleton = new MySingleton(); // I …Run Code Online (Sandbox Code Playgroud) 我在构造函数级别使用google guice注入.对参数进行空检查以确保它们不为null或者为我们执行注入是否有意义.顺便说一下,它是一个公共构造函数.
公共方法怎么样?
我有一个具有以下绑定的模块
bind(BaseAbstract.class).to(Concrete.class).in(Scopes.SINGLETON);
bind(Concrete.class).toProvider(.....);
Run Code Online (Sandbox Code Playgroud)
当我要求Guice为我提供两个类时,一个需要基础,一个需要具体,则创建了两个单独的具体对象。
injector.getInstance(INeedABaseAbstract.class);
injector.getInstance(INeedAConcrete.class);
Run Code Online (Sandbox Code Playgroud)
我只希望Guice将一个单一的Concrete实例提供给需要BaseAbstract或Concrete的类。
有没有办法让guice在实例化单例后调用init()方法?在构造函数中调用init()不是一个选项,因为init()可以被子类覆盖.
我有这个guice代码
public class MainModule extends AbstractModule {
@Override
protected void configure() {
bind(GlobalSettings.class).toProvider(GlobalSettingsProvider.class).in(Singleton.class);
}
Run Code Online (Sandbox Code Playgroud)
和
public class GlobalSettingsProvider implements Provider<GlobalSettings> {
@Override
public GlobalSettings get() {
GlobalSettings globalSettings = new GlobalSettings();
globalSettings.isDummyRun = Boolean.parseBoolean(System.getProperty("isDummyRun", "false"));
globalSettings.inputFlavor = System.getProperty("input_flavor", "none");
}
}
Run Code Online (Sandbox Code Playgroud)
和
public class A(){
public A() {
this.injector = Guice.createInjector(new MainModule());
injector.getInstance(IHttpClientReRunWrapper.class);
globalSettings = injector.getInstance(GlobalSettings.class);
resultsComparerRunner1 = injector.getInstance(ResultsComparerRunner.class);
resultsComparerRunner2 = injector.getInstance(ResultsComparerRunner.class);
resultsComparerRunner3 = injector.getInstance(ResultsComparerRunner.class);
}
}
Run Code Online (Sandbox Code Playgroud)
和
public class ResultsComparerRunner(){
public class ResultsComparerRunner(){
initStaticFromInjector();
}
private void initStaticFromInjector() { …Run Code Online (Sandbox Code Playgroud) 很抱歉提出愚蠢的问题,但我对Java和Guice框架很新.我无法理解Guice Provider类的使用,它提供了正常注入实例的任何压缩类的实例.据我所知,它允许您创建一个类的多个实例,其中Injected实例始终是Singleton.这是唯一的区别还是还有什么呢?
即区别:
@Inject
SomeClass someObjcet;
VS
@Inject
Provider<SomeClass> provider;
provider.get();
我在涉及Guice并避免使用非Guice单身人士方面有些两难。考虑那里有3个模块的多模块项目:shared,frontend和backend。无论是frontend与backend使用的一个实例Profiling的类的内部shared模块(其时间的方法,和在整个项目中广泛使用)。
几乎每个类都需要使用此Profiling实例(包括User用户连接时动态创建的对象)。
如果每个单独的类都需要该类的一个实例Profiling,则执行该方法的不同方法会有一些缺点:
解决方案1(在构造函数中,复制到实例字段):
private final Profiling profiling;
@Inject
public User(Profiling profiling, String username)
Run Code Online (Sandbox Code Playgroud)
缺点:您必须Profiling在每个构造函数中都包含一个对象。这很麻烦,而且毫无意义。您还必须Injector静态存储(或注入)Guice ,以便您可以动态创建User对象,而不仅仅是在首次加载程序时。
解决方案2(仅作为实例字段):
@Inject
private Profiling profiling;
public User(String username)
Run Code Online (Sandbox Code Playgroud)
缺点:与上面类似,您必须使用Guice Injector实例化每个对象。这意味着要User动态创建对象,需要在创建User对象的类中使用Injector的实例。
解决方案3(作为一个(主)类中的静态字段,由我们手动创建)
public static final Profiling PROFILING; // Can also use a get method
public Application() {
Application.PROFILING …Run Code Online (Sandbox Code Playgroud)