在本节末尾: https ://github.com/google/guice/wiki/FrequentlyAskedQuestions#how -do-i-build-two-similar-but-slightly-different-trees-of-objects
有一个链接:
另请参阅Alen Vrecko 的更完整示例。
目前此页面打开一个错误页面。 请更新链接以指向某个工作页面。
看起来链接又可以工作了(内容供参考):
import com.google.inject.*;
import com.google.inject.privatemodules.PrivateModule;
import static java.lang.annotation.ElementType.*;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.Date;
public class RobotLegsProblem2 {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new AbstractModule() {
<strong i="6">@Override</strong>
protected void configure() {
// global stuff
// same to all
bind(Driveline.class).to(FrontWheelDrive.class);
bind(Engine.class).to(DieselEngine.class);
}
}, new PrivateModule() {
<strong i="7">@Override</strong>
protected void configurePrivateBindings() {
// private Module is different story
// Bind car annotated with blue and expose it
bind(Car.class).annotatedWith(Blue.class).to(Car.class);
expose(Car.class).annotatedWith(Blue.class);
// What we bind in here only applies to the exposed stuff
// i.e. the exposed car from this module will get this injected
// where stuff in regular module (Engine,Driveline) is "inherited" - it is global
bind(Transmission.class).to(AutomaticTransmission.class);
}
}, new PrivateModule() {
<strong i="8">@Override</strong>
protected void configurePrivateBindings() {
bind(Car.class).annotatedWith(Red.class).to(Car.class);
expose(Car.class).annotatedWith(Red.class);
bind(Transmission.class).to(ManualTransmission.class);
/*
The point is that you cannot do this with regular module i.e.
bind(Car.class).annotatedWith(Blue.class).to(Car.class);
bind(Car.class).annotatedWith(Red.class).to(Car.class);
now notice the dilemma
class Car{
<strong i="9">@Inject</strong> Transmission transmission;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
You cannot solve this by
<strong i="10">@Inject</strong> <strong i="11">@Blue</strong> <strong i="12">@Red</strong> Transmission transmission;
or
bind(Transmission.class).to(AutomaticTransmission.class).ifParentAnnotatedWith(Blue.class)
bind(Transmission.class).to(ManualTransmission.class).ifParentAnnotatedWith(Red.class)
but with private modules you can get this functionality
*/
}
});
Car blueCar = injector.getInstance(Key.get(Car.class, Blue.class));
System.out.println("Blue car transmission: " + blueCar.getTransmission());
Car redCar = injector.getInstance(Key.get(Car.class, Red.class));
System.out.println("Red car transmission: " + redCar.getTransmission());
}
}
@Retention(RetentionPolicy.RUNTIME)
@Target({FIELD, PARAMETER, METHOD})
<strong i="13">@BindingAnnotation</strong>
<strong i="14">@interface</strong> Blue {
}
@Retention(RetentionPolicy.RUNTIME)
@Target({FIELD, PARAMETER, METHOD})
<strong i="15">@BindingAnnotation</strong>
<strong i="16">@interface</strong> Red {
}
class Car {
private final Engine engine;
private final Transmission transmission;
private final Driveline driveline;
<strong i="17">@Inject</strong>
public Car(Engine engine, Transmission transmission, Driveline driveline) {
this.engine = engine;
this.transmission = transmission;
this.driveline = driveline;;
}
public Driveline getDriveline() {
return driveline;
}
public Engine getEngine() {
return engine;
}
public Transmission getTransmission() {
return transmission;
}
}
interface Transmission {
}
class AutomaticTransmission implements Transmission {
}
class ManualTransmission implements Transmission {
}
interface Engine {
}
class DieselEngine implements Engine {
}
class PetrolEngine implements Engine {
}
interface Driveline {
}
class FourWheelDrive implements Driveline {
}
class FrontWheelDrive implements Driveline {
}
class RearWheelDrive implements Driveline {
}
链接又断了。
看起来馅饼服务器已关闭。 它可能会回来,但更新链接以指向此错误似乎更好; 感谢@rcchan提供内容。
嗨,这个代码示例在最新版本的 Guice 中仍然有效吗? 似乎PrivateModule
改变了包并且configurePrivateBindings
变成configure
?
最有用的评论
看起来链接又可以工作了(内容供参考):