Reputation: 103577
I am going through some blogs on SpringSource and in one of the blogs, the author is using @Inject
and I suppose he can also use @Autowired
.
Here is the piece of code:
@Inject private CustomerOrderService customerOrderService;
So what is the difference between using @Inject
and @Autowired
and would appreciate it if someone explained their difference and which one to use under what situation.
Upvotes: 817
Views: 410552
Reputation: 1727
Inject and Autowired both serves the same functionality i.e to inject the bean.
@Inject - It's defined in the javax.inject package and it's part of Java.
If your application is not spring framework then use Inject annotation as it's part of java.
@Autowired – It's defined in the package org.springframework.bean.factory and part of Spring framework. If your application is Spring based application then better use Autowired annotation.
Upvotes: 0
Reputation: 27614
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 work the same way as Spring has decided to support some JSR-299 annotations in addition to their own.
Upvotes: 851
Reputation: 2358
@Autowired(required=false) By default the dependency injection for @Autowired must be fulfilled because the value of required attribute is true by default. We can change this behavior by using @Autowired(required=false). In this case if bean is not found for dependency injection, it will not through error.
Please have look at https://www.concretepage.com/spring/spring-autowired-annotation#required-false
But @Inject doesn’t need (required=false) it will not through error if dependency is not found
Upvotes: 2
Reputation: 201
In addition to the above:
@Autowired
beans is Singleton whereas using JSR 330 @Inject
annotation it is like Spring's prototype.@Inject
.@Inject
.Upvotes: 16
Reputation:
@Autowired
annotation is defined in the Spring framework.
@Inject
annotation is a standard annotation, which is defined in the standard "Dependency Injection for Java" (JSR-330). Spring (since the version 3.0) supports the generalized model of dependency injection which is defined in the standard JSR-330. (Google Guice frameworks and Picocontainer framework also support this model).
With @Inject
can be injected the reference to the implementation of the Provider
interface, which allows injecting the deferred references.
Annotations @Inject
and @Autowired
- is almost complete analogies. As well as @Autowired
annotation, @Inject
annotation can be used for automatic binding properties, methods, and constructors.
In contrast to @Autowired
annotation, @Inject
annotation has no required
attribute. Therefore, if the dependencies will not be found - will be thrown an exception.
There are also differences in the clarifications of the binding properties. If there is ambiguity in the choice of components for the injection the @Named
qualifier should be added. In a similar situation for @Autowired
annotation will be added @Qualifier
qualifier (JSR-330 defines it's own @Qualifier
annotation and via this qualifier annotation @Named
is defined).
Upvotes: 16
Reputation: 17365
The key difference(noticed when reading the Spring Docs) between @Autowired
and @Inject
is that, @Autowired
has the 'required' attribute while the @Inject has no 'required' attribute.
Upvotes: 32
Reputation: 93
The @Inject
annotation is one of the JSR-330 annotations collection. This has Match by Type,Match by Qualifier, Match by Name execution paths.
These execution paths are valid for both setter and field injection.The behavior of @Autowired
annotation is same as the @Inject
annotation. The only difference is the @Autowired
annotation is a part of the Spring framework. @Autowired
annotation also has the above execution paths. So I recommend the @Autowired
for your answer.
Upvotes: 0
Reputation: 596
Better use @Inject all the time. Because it is java configuration approach(provided by sun) which makes our application agnostic to the framework. So if you spring also your classes will work.
If you use @Autowired it will works only with spring because @Autowired is spring provided annotation.
Upvotes: 16
Reputation: 4411
As of Spring 3.0, Spring offers support for JSR-330 dependency injection annotations (@Inject
, @Named
, @Singleton
).
There is a separate section in the Spring documentation about them, including comparisons to their Spring equivalents.
Upvotes: 26
Reputation: 471
To handle the situation in which there is no wiring, beans are available with @Autowired
required
attribute set to false
.
But when using @Inject
, the Provider interface works with the bean which means that the bean is not injected directly but with the Provider.
Upvotes: 47
Reputation: 42834
Here is a blog post that compares @Resource
, @Inject
, and @Autowired
, and appears to do a pretty comprehensive job.
From the link:
With the exception of test 2 & 7 the configuration and outcomes were identical. When I looked under the hood I determined that the ‘@Autowired’ and ‘@Inject’ annotation behave identically. Both of these annotations use the ‘AutowiredAnnotationBeanPostProcessor’ to inject dependencies. ‘@Autowired’ and ‘@Inject’ can be used interchangeable to inject Spring beans. However the ‘@Resource’ annotation uses the ‘CommonAnnotationBeanPostProcessor’ to inject dependencies. Even though they use different post processor classes they all behave nearly identically. Below is a summary of their execution paths.
Tests 2 and 7 that the author references are 'injection by field name' and 'an attempt at resolving a bean using a bad qualifier', respectively.
The Conclusion should give you all the information you need.
Upvotes: 176