On 8 March 2011 13:03, Stuart McCulloch <[email protected]> wrote:

> On 8 March 2011 11:07, EricB <[email protected]> wrote:
>
>> Hello.
>>
>> I'm  trying to convert code to Guice and I'm looking for the Guice
>> equivalent for the following spring behavior:
>> @Autowired List<ConnectionStrategy> beans;
>> Spring DI will provide a list of all classes that implements
>> ConnectionStrategy assuming they are all annotated with @Component
>> Now I'm trying to do the same with Guice.
>>
>> Multibinder might help but it still lacks some automation I need.
>> Here is what I've got:
>> Multibinder<ConnectionStrategy> strategiesBinder =
>> Multibinder.newSetBinder(binder(), ConnectionStrategy.class);
>>
>> //Now this is the not fun part I don't wat to add this binding myself
>> for each implementation.
>> strategiesBinder.addBinding().to(DirectConnectionStrategy.class);
>>
>> As I have many connection strategies, and since I want to let others
>> extend my application and provide their own strategies I wish guice
>> could just figure out the classes that are annotated somehow and that
>> I wont have to call the addBinding() method for each implementation I
>> have.
>> Now. I know I can write a provider and add a binding to that provider
>> but I don't want to start messing with building a list in that
>> provider by using reflection and such.
>> What do you suggest?
>>
>
> the Injector SPI has a findBindingsByType method, so you could add
> something like this in your module:
>
>     @Provides
>     List<ConnectionStrategy> getConnectionStrategies( Injector injector )
>     {
>         List<ConnectionStrategy> connectionStrategies = new
> ArrayList<ConnectionStrategy>();
>         for ( Binding<ConnectionStrategy> binding :
> injector. findBindingsByType( TypeLiteral.get( ConnectionStrategy.class ) )
>         {
>             connectionStrategies.add( binding.getProvider().get() );    //
> may want to wrap in try...catch for robustness?
>         }
>         return connectionStrategies;
>     }
>
> ( caveat: I just typed up that code ad-hoc, haven't checked it actually
> compiles :)
>

^ of course that still assumes you've bound your implementations in some
module(s) in the same injector.
If you want classpath scanning then there's plenty of Guice extensions out
there that can do that for you.


> I use a similar technique in sisu-inject, although it's more complex since
> it handles dynamic graphs of injectors where each one can come and go at any
> time
>
> Thanks.
>>
>
-- 
Cheers, Stuart

-- 
You received this message because you are subscribed to the Google Groups 
"google-guice" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-guice?hl=en.

Reply via email to