You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@sis.apache.org by Martin Desruisseaux <ma...@geomatys.fr> on 2012/12/10 10:21:07 UTC
Need a dependency injection framework
Hello all
I committed today a "DefaultNameFactoryTest" file. If one looks at the
source code [1], the interesting aspect is that this file doesn't
contain any test. Instead it just creates a SIS DefaultNameFactoryTest
instance, passes it to the super-class constructor and inherits all the
tests defined in GeoAPI [2]. This illustrates the GeoAPI
inter-operability goal, admittedly only at the test suite level in this
case.
In this test case, DefaultNameFactory is instantiated directly. However
in a production environment, we need to allow users to specify their own
Factory instance. In Geotk, we tried to do that using
java.util.ServiceLoader. However while ServiceLoader is still very well
suited to situations where we need *all* instances of a given interface
(all map projections, or image readers for all formats, etc.), it become
difficult when we need to select one instance among many possibilities.
An alternative proposed years ago was to use Spring, but I would like to
avoid making such dependency mandatory.
Since 2009, JSR-330 [3] is providing an @Inject annotation for that.
JSR-330 is a 2.4 JAR file available on Maven central under Apache 2
license, so it seems a reasonable dependency. Note that JSR-330 provides
only annotations - implementations is another matter, discussed below.
Those annotations are now included in JEE 6 [4]. So they do not
introduce any new dependency in JEE environments. But it would introduce
dependency in JSE environments. In addition to the above-cited JSR-330
JAR files, JSE environments would need an implementation. One impossible
implementation is Google Guice [5], also available on Maven Central
under Apache 2 license. However this is an almost 700 kb dependency,
with some transitive dependencies (I didn't analysed them yet). However
I'm not yet familiar with Juice - in particular does it forces
applications to be run is some kind of containers?
An alternative could also be to provide our own trivial implementation
(just hard-coded references to the factory implementations), which users
can replace by Guice or JEE when such environment in available. Since I
have never experimented JSR-330 yet, I don't know if it is a reasonable
approach.
Any though?
Martin
[1]
https://svn.apache.org/repos/asf/sis/branches/JDK7/sis-utility/src/test/java/org/apache/sis/util/type/DefaultNameFactoryTest.java
[2]
http://www.geoapi.org/geoapi-conformance/apidocs/org/opengis/test/util/NameTest.html
[3] http://jcp.org/aboutJava/communityprocess/final/jsr330/index.html
[4] http://docs.oracle.com/javaee/6/api/javax/inject/package-summary.html
[5] http://code.google.com/p/google-guice/
Re: Need a dependency injection framework
Posted by Martin Desruisseaux <ma...@geomatys.fr>.
Le 10/12/12 18:21, Martin Desruisseaux a écrit :
> One impossible implementation is Google Guice
Typo: I mean "one possible implementation"
Martin
Re: Need a dependency injection framework
Posted by "Mattmann, Chris A (388J)" <ch...@jpl.nasa.gov>.
Hey Martin,
My +1 here would be for Guice or for Spring -- (though Spring introduces a
ton of bloat).
I've heard good things about Guice and 700kb is pretty small compared to
Spring :)
Cheers,
Chris
On 12/10/12 1:21 AM, "Martin Desruisseaux"
<ma...@geomatys.fr> wrote:
>Hello all
>
>I committed today a "DefaultNameFactoryTest" file. If one looks at the
>source code [1], the interesting aspect is that this file doesn't
>contain any test. Instead it just creates a SIS DefaultNameFactoryTest
>instance, passes it to the super-class constructor and inherits all the
>tests defined in GeoAPI [2]. This illustrates the GeoAPI
>inter-operability goal, admittedly only at the test suite level in this
>case.
>
>In this test case, DefaultNameFactory is instantiated directly. However
>in a production environment, we need to allow users to specify their own
>Factory instance. In Geotk, we tried to do that using
>java.util.ServiceLoader. However while ServiceLoader is still very well
>suited to situations where we need *all* instances of a given interface
>(all map projections, or image readers for all formats, etc.), it become
>difficult when we need to select one instance among many possibilities.
>An alternative proposed years ago was to use Spring, but I would like to
>avoid making such dependency mandatory.
>
>Since 2009, JSR-330 [3] is providing an @Inject annotation for that.
>JSR-330 is a 2.4 JAR file available on Maven central under Apache 2
>license, so it seems a reasonable dependency. Note that JSR-330 provides
>only annotations - implementations is another matter, discussed below.
>
>Those annotations are now included in JEE 6 [4]. So they do not
>introduce any new dependency in JEE environments. But it would introduce
>dependency in JSE environments. In addition to the above-cited JSR-330
>JAR files, JSE environments would need an implementation. One impossible
>implementation is Google Guice [5], also available on Maven Central
>under Apache 2 license. However this is an almost 700 kb dependency,
>with some transitive dependencies (I didn't analysed them yet). However
>I'm not yet familiar with Juice - in particular does it forces
>applications to be run is some kind of containers?
>
>An alternative could also be to provide our own trivial implementation
>(just hard-coded references to the factory implementations), which users
>can replace by Guice or JEE when such environment in available. Since I
>have never experimented JSR-330 yet, I don't know if it is a reasonable
>approach.
>
>Any though?
>
> Martin
>
>
>[1]
>https://svn.apache.org/repos/asf/sis/branches/JDK7/sis-utility/src/test/ja
>va/org/apache/sis/util/type/DefaultNameFactoryTest.java
>[2]
>http://www.geoapi.org/geoapi-conformance/apidocs/org/opengis/test/util/Nam
>eTest.html
>[3] http://jcp.org/aboutJava/communityprocess/final/jsr330/index.html
>[4] http://docs.oracle.com/javaee/6/api/javax/inject/package-summary.html
>[5] http://code.google.com/p/google-guice/
>