Cross Module Dependency Injection

Alan Bateman Alan.Bateman at oracle.com
Mon Oct 10 10:45:21 UTC 2016


On 09/10/2016 01:20, Matthew Madson wrote:

> Hi there Project Jigsaw Devs,
>
> I was viewing a recent talk posted to the vjug on Jigsaw and had a question
> about cross module service dependencies.
>
> Basically I was wondering if the functionality of the ServiceLoader could
> be abstracted away using dependency injection (CDI or otherwise).
>
> For example, if I have a CLI module which uses ServiceLoader to obtain
> implementations of some dictionary service api, and one of the
> implementations requires a DataSource, I would like to declare that
> dependency on the DataSource in the ctor of the
> DbBackedDictionaryServiceImpl perhaps with an @Inject annotation and have
> (perhaps the module system?) automatically look for a suitable providers of
> the DataSoruce using the ServiceLoader. Alternatively I could perhaps
> declare @Inject on a Set or List of DataSource to support multiple
> DataSources.
>
> Basically I'm interested in moving the dependencies provided by the
> ServiceLoader into the constructor to make them more explicit.
>
I suspect your mail/scenario can be interpreted in several ways. One 
read is that you are describing the following scenario:

- A CLI module `uses p.DictionaryService`

- A provider module `provides p.DictionaryService with 
q.DbBackedDictionaryServiceImpl`.

- In q.DbBackedDictionaryServiceImpl you have @Inject @DataSource.

- Some other module, the producer module, you have @Produces @DataSource.

(I'm assuming here that @DataSource is your annotation rather than 
javax.sql.DataSource).

If this is the scenario then all I can suggest is try it out and report 
back your experiences. I expect it should just work when the producer is 
in the same module as q.DbBackedDictionaryServiceImpl. That is, 
something like this should just work:

weak module dbprovider {
     provides p.DictionaryService with q.DbBackedDictionaryServiceImpl;
     requires weld.se;
}

assuming there is code somewhere to initialize the CDI container and 
select the DataSource instance.

If they are in separate modules then I assume some configuration is 
needed so that the CDI container will locate the producer.  Also since 
nobody will directly depend on the producer then you'll need to use 
`--add-modules` to add it to the set of modules to resolve.

As I said, your mail can be read in many ways. I've read it that you are 
replacing the use of SL in DbBackedDictionaryServiceImpl but maybe you 
are actually looking to replace it in the CLI module. Alternatively you 
might be asking if the module system could somehow know about the 
@Inject/@Produces annotations so that service binding will automatically 
locate producers and resolve them.

-Alan


More information about the jigsaw-dev mailing list