In CDI you can define an object that will give you items of a certain type, using:
@Inject Instance<MyObject> myObjectInstance; //... MyObject myObjectInstance.get();
Similarly in Guice you can do:
@Inject Provider<MyObject> myObjectInstance; //... MyObject myObjectInstance.get();
I am wondering if there is a similar construct in Spring, or you must use the ApplicationContext
in order to get the reference?
Guice uses binding as the equivalent to wiring in Spring. Simply put, bindings allow us to define how dependencies are going to be injected into a class. Guice bindings are declared in our module's configure() method. Instead of @Autowired, Guice uses the @Inject annotation to inject the dependencies.
Spring allows you to omit the @Autowired annotation when there's only one constructor. Guice allows binding to a Provider, as well as injecting a Provider of your class, even when your class has no Provider binding.
1. Overview. CDI (Contexts and Dependency Injection) is a standard dependency injection framework included in Java EE 6 and higher. It allows us to manage the lifecycle of stateful components via domain-specific lifecycle contexts and inject components (services) into client objects in a type-safe way.
Dependency Injection is the main functionality provided by Spring IOC(Inversion of Control). The Spring-Core module is responsible for injecting dependencies through either Constructor or Setter methods.
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With