Hi Tom, Nice to see thoughts about modular services.
FYI Jigsaw's goals in this area were quite limited (http://openjdk.java.net/projects/jigsaw/spec/reqs/#services) and the static provider method was a relatively late add-on (http://openjdk.java.net/projects/jigsaw/spec/issues/#services).
I agree that a static provider method offers a basic level of indirection (e.g. multiple `provides` directives can employ the same one if its return type implements multiple services) but it doesn't add much in the way of abstraction (e.g. over the desired service). This isn't the only place where ServiceLoader suffers from a lack of abstraction: you can't parameterize services because there's no way to request an implementation of a parameterized service (i.e. you can't say `ServiceLoader.load(ServiceA<Foo>.class)`).
Frankly, we are not likely to revisit any of these limitations in the near future, but I think that ServiceLoader will always be a handy built-in option for limited use cases.
Alex On 3/2/2019 9:19 AM, Tom De Wolf wrote:
The current ServiceLoader mechanism and Java Modules have a limited set of options to provide an instance for a service from a module. Or you use the constructor, or you use a static 'provider' method. When interacting with frameworks like Spring this does not give a lot of flexibility. I described the problem statement and some ideas which could be considered for evolving the services support in the module system in this blog post: https://devcreativity.wordpress.com/2019/03/02/java-modules-wish-list-provide-services-using-lambda-functions-and-more/ I would appreciate if some of the oracle contributors that worked on the module system could read the post and provide me and the community with some feedback if such a change could be a good idea? Thanks in advance Tom