What is the difference between @Inject and @Autowired in Spring Framework? Which one to use under what condition?
Assuming here you're referring to the javax.inject.Inject
annotation. @Inject
is part of the Java CDI (Contexts and Dependency Injection) standard introduced in Java EE 6 (JSR-299), read more. Spring has chosen to support using the @Inject
annotation synonymously with their own @Autowired
annotation.
So, to answer your question, @Autowired
is Spring's own annotation. @Inject
is part of a Java technology called CDI that defines a standard for dependency injection similar to Spring. In a Spring application, the two annotations works the same way as Spring has decided to support some JSR-299 annotations in addition to their own.
What is the difference between @Inject and @Autowired
From what I know, they do the same. @Inject is an annotation from javax.inject, which is only the API for dependency injection. In Spring you can use both, as I think Spring provides an implementation for @Inject which does the same thing as @Autowired in Spring environments.
Matthias Wessendorf blogged about this here: http://matthiaswessendorf.wordpress.com/2010/04/20/spring-3-0-and-jsr-330-part-2/
Should @Inject and @Autowired ever be explicitly declared?
IMO such annotations should always be explicitly declared. Spring does not require it for constructor DI. However, I would avoid doing anything framework specific, unless it is required. That being said, I would use the javax Inject annotation and be explicit everywhere.
Spring @Autowire on Properties vs Constructor
Yes, option B (which is called constructor injection) is actually recommended over field injection, and has several advantages:
- the dependencies are clearly identified. There is no way to forget one when testing, or instantiating the object in any other circumstance (like creating the bean instance explicitly in a config class)
- the dependencies can be final, which helps with robustness and thread-safety
- you don't need reflection to set the dependencies. InjectMocks is still usable, but not necessary. You can just create mocks by yourself and inject them by simply calling the constructor
See this blog post for a more detailed article, by one of the Spring contributors, Olivier Gierke.
What happens when an interface is Autowired vs the implementation
As long as there is only a single implementation of the interface and that implementation is annotated with @Component
with Spring's component scan enabled, Spring framework can find out the (interface, implementation) pair.
Once you have more than one implementation, then you need to qualify each of them and during auto-wiring, you would need to use the @Qualifier
annotation to inject the right implementation, along with @Autowired
annotation. If you are using @Resource
(J2EE), then you should specify the bean name using the name attribute of this annotation.
Normally, both will work, you can autowire interfaces or classes.
Related Topics
How to Display Legend for Pie Chart in Columns
Possible Heap Pollution via Varargs Parameter
How to Convert Ascii Code (0-255) to Its Corresponding Character
How Is Hashcode() Calculated in Java
Is Java.Util.Date Using Timezone
What Is Difference Between Crudrepository and JPArepository Interfaces in Spring Data JPA
How to Create an Asynchronous Http Request in Java
Increase the Java Heap Size Permanently
Any Way to Share Session State Between Different Applications in Tomcat
How to Write Logs in Text File When Using Java.Util.Logging.Logger
Is Httpsession Thread Safe, Are Set/Get Attribute Thread Safe Operations
Why Do Many Collection Classes in Java Extend the Abstract Class and Implement the Interface as Well
How to Sum Digits of an Integer in Java
How to Get the Latest Jre/Jdk as a Zip File Rather Than Exe or Msi Installer
Configuring Spring Security 3.X to Have Multiple Entry Points