Guice: 常见问题解答中的链接断开

创建于 2016-09-15  ·  4评论  ·  资料来源: google/guice

在本节末尾: 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 {
}

所有4条评论

看起来链接又可以工作了(内容供参考):

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

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

dxiao picture dxiao  ·  4评论

afghl picture afghl  ·  5评论

jhm-ciberman picture jhm-ciberman  ·  10评论

felixblaschke picture felixblaschke  ·  51评论

avoss picture avoss  ·  17评论