I'm curious to know what's the difference between code like this:
class MyClass { @Autowired MyService myService; }
and code like this:
class MyClass { MyService myService; @Required public void setMyService(MyService val) { this.myService = val; } }
You can use @Autowired annotation on setter methods to get rid of the <property> element in XML configuration file. When Spring finds an @Autowired annotation used with setter methods, it tries to perform byType autowiring on the method.
@Inject and @Autowired both annotations are used for autowiring in your application. @Inject annotation is part of Java CDI which was introduced in Java 6, whereas @Autowire annotation is part of spring framework. Both annotations fulfill same purpose therefore, anything of these we can use in our application.
The @Required annotation applies to bean property setter methods and it indicates that the affected bean property must be populated in XML configuration file at configuration time. Otherwise, the container throws a BeanInitializationException exception.
The main difference is is that @Autowired is a spring annotation whereas @Resource is specified by the JSR-250. So the latter is part of normal java where as @Autowired is only available by spring.
@Autowired
annotation is used when you want to autowire a bean. @Autowired
is not limited to setter. It can be used with a constructor and a field as well. If you use @Autowired
annotation on a field, that field will be autowired with bean having matching data type.
@Required
checks if a particular property has been set or not. If a field has been annotated with @Required
annotation and that field is not set, you will get org.springframework.beans.factory.BeanInitializationException
.
Refer:
Spring @Autowired usage
Recommended usage of Spring's @Required annotation
Edit: As pointed by 'kryger': field annotated with @Autowired
is effectively also @Required
(unless you explicitly set its parameter required to false). eg:
@Autowired(required=false) private ObjectType objectType;
For a field that has been annotated @Autowired
, if bean with matching data type in not available, org.springframework.beans.factory.BeanCreationException
is thrown.
@Autowired
is not the same as @Required
.
The @Autowire
-Annotation (as in your code-example), tells the ApplicationContext (a.k.a the Spring-IoC-Containter) to inject the desired dependency. (No matter how, if its by using annotations or the XML-File of the ApplicationContext).
The @Required
-Annotation, tells the ApplicationContext that this property has to be mentioned in the XML-file (The XML-File of the ApplicationContext), which than leds to the dependency being injected by using the XML-File (or to an expection of course). But the Annotation on its own doesn't tell to inject the dependency! The injection is done because the property is mentioned in the XML-file. That's good to know, you may need it.
With mentioning the property in a XML-File I mean such a configuration for instance:
<bean id="MyClass" class="com.myclasses.common.MyClass"> <property name="someProperty" value="ValueThatHasToBeInjected" /> </bean>
So why should I use it over the @Autowired-Annotation?
You should use it when the dependency has to be injected by the information in the XML-configuration file.
Can you give me an example?
Well, there is already a very good example on this website. where this is also explained.
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