public class GinFactoryModuleBuilder extends Object
FactoryModuleBuilder
. Usage is
mostly the same, with the exception of forwarded bindings (see at the
bottom of this documentation).
Provides a factory that combines the caller's arguments with
injector-supplied values to construct objects.
public interface PaymentFactory { Payment create(Date startDate, Money amount); }You can name your factory methods whatever you like, such as create, createPayment or newPayment.
constructedType
is a concrete class with an
@Inject
-annotated constructor. In addition to injector-
supplied parameters, the constructor should have parameters that match each
of the factory method's parameters. Each factory-supplied parameter requires
an @Assisted
annotation. This serves to document that the
parameter is not bound by your application's modules.
public class RealPayment implements Payment { @Inject public RealPayment( CreditService creditService, AuthService authService, @Assisted Date startDate, @Assisted Money amount) { ... } }
AssistedInject
, in order to match the
different parameters types of the factory methods.
public interface PaymentFactory { Payment create(Date startDate, Money amount); Payment createWithoutDate(Money amount); } public class RealPayment implements Payment { @AssistedInject public RealPayment( CreditService creditService, AuthService authService, @Assisted Date startDate, @Assisted Money amount) { ... } @AssistedInject public RealPayment( CreditService creditService, AuthService authService, @Assisted Money amount) { ... } }
module
, install a GinFactoryModuleBuilder
that creates the factory:
install(new GinFactoryModuleBuilder() .implement(Payment.class, RealPayment.class) .build(PaymentFactory.class);As a side-effect of this binding, Gin will inject the factory to initialize it for use. The factory cannot be used until the injector has been initialized.
public class PaymentAction { @Inject private PaymentFactory paymentFactory; public void doPayment(Money amount) { Payment payment = paymentFactory.create(new Date(), amount); payment.apply(); } }
Assisted
annotation to disambiguate the parameters. The
names must be applied to the factory method's parameters:
public interface PaymentFactory { Payment create( @Assisted("startDate") Date startDate, @Assisted("dueDate") Date dueDate, Money amount); }...and to the concrete type's constructor parameters:
public class RealPayment implements Payment { @Inject public RealPayment( CreditService creditService, AuthService authService, @Assisted("startDate") Date startDate, @Assisted("dueDate") Date dueDate, @Assisted Money amount) { ... } }
Inject
members will be injected before they are returned.
public interface FruitFactory { Apple getApple(Color color); } ... protected void configure() { install(new GinFactoryModuleBuilder().build(FruitFactory.class)); }Note that any type returned by the factory in this manner needs to be an implementation class. To return two different implementations for the same interface from your factory, use binding annotations on your return types:
interface CarFactory { @Named("fast") Car getFastCar(Color color); @Named("clean") Car getCleanCar(Color color); } ... protected void configure() { install(new GinFactoryModuleBuilder() .implement(Car.class, Names.named("fast"), Porsche.class) .implement(Car.class, Names.named("clean"), Prius.class) .build(CarFactory.class)); }In difference to regular Guice Assisted Inject, in Gin, return types in your factory are not further resolved using your regular injector configuration. This means that in the following example you'll still get a
Chicken
and not a Rooster
:
interface Animal {} public class Chicken implements Animal {} public class Rooster extends Chicken {} interface AnimalFactory { Animal getAnimal(); } ... protected void configure() { bind(Chicken.class).to(Rooster.class); install(new GinFactoryModuleBuilder() .implement(Animal.class, Chicken.class) .build(AnimalFactory.class)); }
Constructor and Description |
---|
GinFactoryModuleBuilder() |
Modifier and Type | Method and Description |
---|---|
<F> GinModule |
build(Class<F> factoryInterface)
See the factory configuration examples at
GinFactoryModuleBuilder . |
<F> GinModule |
build(Key<F> factoryInterface) |
<F> GinModule |
build(TypeLiteral<F> factoryInterface)
See the factory configuration examples at
GinFactoryModuleBuilder . |
<T> GinFactoryModuleBuilder |
implement(Class<T> source,
Annotation annotation,
Class<? extends T> target)
See the factory configuration examples at
GinFactoryModuleBuilder . |
<T> GinFactoryModuleBuilder |
implement(Class<T> source,
Annotation annotation,
TypeLiteral<? extends T> target)
See the factory configuration examples at
GinFactoryModuleBuilder . |
<T> GinFactoryModuleBuilder |
implement(Class<T> source,
Class<? extends Annotation> annotationType,
Class<? extends T> target)
See the factory configuration examples at
GinFactoryModuleBuilder . |
<T> GinFactoryModuleBuilder |
implement(Class<T> source,
Class<? extends Annotation> annotationType,
TypeLiteral<? extends T> target)
See the factory configuration examples at
GinFactoryModuleBuilder . |
<T> GinFactoryModuleBuilder |
implement(Class<T> source,
Class<? extends T> target)
See the factory configuration examples at
GinFactoryModuleBuilder . |
<T> GinFactoryModuleBuilder |
implement(Class<T> source,
TypeLiteral<? extends T> target)
See the factory configuration examples at
GinFactoryModuleBuilder . |
<T> GinFactoryModuleBuilder |
implement(Key<T> source,
Class<? extends T> target)
See the factory configuration examples at
GinFactoryModuleBuilder . |
<T> GinFactoryModuleBuilder |
implement(Key<T> source,
TypeLiteral<? extends T> target)
See the factory configuration examples at
GinFactoryModuleBuilder . |
<T> GinFactoryModuleBuilder |
implement(TypeLiteral<T> source,
Annotation annotation,
Class<? extends T> target)
See the factory configuration examples at
GinFactoryModuleBuilder . |
<T> GinFactoryModuleBuilder |
implement(TypeLiteral<T> source,
Annotation annotation,
TypeLiteral<? extends T> target)
See the factory configuration examples at
GinFactoryModuleBuilder . |
<T> GinFactoryModuleBuilder |
implement(TypeLiteral<T> source,
Class<? extends Annotation> annotationType,
Class<? extends T> target)
See the factory configuration examples at
GinFactoryModuleBuilder . |
<T> GinFactoryModuleBuilder |
implement(TypeLiteral<T> source,
Class<? extends Annotation> annotationType,
TypeLiteral<? extends T> target)
See the factory configuration examples at
GinFactoryModuleBuilder . |
<T> GinFactoryModuleBuilder |
implement(TypeLiteral<T> source,
Class<? extends T> target)
See the factory configuration examples at
GinFactoryModuleBuilder . |
<T> GinFactoryModuleBuilder |
implement(TypeLiteral<T> source,
TypeLiteral<? extends T> target)
See the factory configuration examples at
GinFactoryModuleBuilder . |
public <T> GinFactoryModuleBuilder implement(Class<T> source, Class<? extends T> target)
GinFactoryModuleBuilder
.public <T> GinFactoryModuleBuilder implement(Class<T> source, TypeLiteral<? extends T> target)
GinFactoryModuleBuilder
.public <T> GinFactoryModuleBuilder implement(TypeLiteral<T> source, Class<? extends T> target)
GinFactoryModuleBuilder
.public <T> GinFactoryModuleBuilder implement(TypeLiteral<T> source, TypeLiteral<? extends T> target)
GinFactoryModuleBuilder
.public <T> GinFactoryModuleBuilder implement(Class<T> source, Annotation annotation, Class<? extends T> target)
GinFactoryModuleBuilder
.public <T> GinFactoryModuleBuilder implement(Class<T> source, Annotation annotation, TypeLiteral<? extends T> target)
GinFactoryModuleBuilder
.public <T> GinFactoryModuleBuilder implement(TypeLiteral<T> source, Annotation annotation, Class<? extends T> target)
GinFactoryModuleBuilder
.public <T> GinFactoryModuleBuilder implement(TypeLiteral<T> source, Annotation annotation, TypeLiteral<? extends T> target)
GinFactoryModuleBuilder
.public <T> GinFactoryModuleBuilder implement(Class<T> source, Class<? extends Annotation> annotationType, Class<? extends T> target)
GinFactoryModuleBuilder
.public <T> GinFactoryModuleBuilder implement(Class<T> source, Class<? extends Annotation> annotationType, TypeLiteral<? extends T> target)
GinFactoryModuleBuilder
.public <T> GinFactoryModuleBuilder implement(TypeLiteral<T> source, Class<? extends Annotation> annotationType, Class<? extends T> target)
GinFactoryModuleBuilder
.public <T> GinFactoryModuleBuilder implement(TypeLiteral<T> source, Class<? extends Annotation> annotationType, TypeLiteral<? extends T> target)
GinFactoryModuleBuilder
.public <T> GinFactoryModuleBuilder implement(Key<T> source, Class<? extends T> target)
GinFactoryModuleBuilder
.public <T> GinFactoryModuleBuilder implement(Key<T> source, TypeLiteral<? extends T> target)
GinFactoryModuleBuilder
.public <F> GinModule build(Class<F> factoryInterface)
GinFactoryModuleBuilder
.public <F> GinModule build(TypeLiteral<F> factoryInterface)
GinFactoryModuleBuilder
.Copyright © 2008–2018. All rights reserved.