So after a lot of digging around I found out that Spring supports JSR-330. This JSR defines a simple API - the whole spec is literally just this API - that standardizes several dependency injection interfaces, annotations and behaviors.
Unlike Spring's FactoryBean
the javax.inject.Provider
interface doesn't throws Exception on getting the bean reference. Furthermore, you would still need to define this FactoryBean in some place (read XML, or @Configuration
class, and this is suboptimal).
Due to a bug, in current Spring 3.1.1, the javax.inject.Provider
does not work. It does work in Spring 3.1.0.
In order to use it you simple need to include the javax.inject
jar
- if you use maven you can:
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
Spring will detect it, and from that moment on you can simply:
@Inject
Provider<MyObject> myObjectInstance;
//...
MyObject myObjectInstance.get();
like in the Guice example, since it is the same API.
Despite my previous comment to Konstantin, Spring does create the Provider by itself. (I was testing it against Spring 3.1.1 and run into this Spring Provider regression issue)
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…