@Autowired annotation is a relatively new style of implementing a Dependency Injection. It allows you to inject other beans into another desired bean. Similar to the @Required annotation, the @Autowired annotation can be used to “autowire” bean on setter methods as well as constructors and properties..
@Autowired Annotation on Setter Methods
Please note that when the @Autowired annotation is used on a setter method, it automatically gets rids of the <property> element that resides in the XML configuration file. Instead, when Spring discovers a setter method that has used the @Autowired annotation, it performs a byType “autowiring” on that specific method.
Let’s see @Autowired in practice. More specifically, @Autowired on a setter method.
ExampleService.java
public class ExampleService { private Employee employee; @Autowired public void setEmployee(Employee emp) { // setting the employee employee = emp; } }
Breakdown
Nothing fancy in the example above. We just have a service class named ExampleService that has an instance variable of type Employee and has a setter method named setEmployee(Employee emp) that just sets the employee to whatever is given as an argument.
Thanks to the @Autowired annotation, an instance of Employee is being injected as an argument to that method when ExampleService is instantiated.
@Autowired Annotation on Constructors
public class ExampleService { private Employee employee; @Autowired public ExampleService(Employee employee) { this.employee = employee; } @Autowired public void setEmployee(Employee emp) { // setting the employee employee = emp; } }
Once again, thanks to the @Autowired annotation, an instance of Employee is being injected as an argument to the constructor when the ExampleService is instantiated.
@Autowired Annotation on Properties
Autowiring properties saves us time and code lines. How? Well, when we use that annotation on Properties, these properties no longer need getters and setters. Cool right?
public class ExampleService { @Autowired private Employee employee; @Autowired public ExampleService(Employee employee) { this.employee = employee; } @Autowired public void setEmployee(Employee emp) { // setting the employee employee = emp; } }
In the code snippet above, we autowired the property named employee. Therefore, it no longer needs setter and getter methods. employee gets injected by Spring when ExampleService is created.
Optional Dependencies
@Autowired can also be optional. Like so:
public class ExampleService { @Autowired(required = false) private Employee employee; @Autowired public ExampleService(Employee employee) { this.employee = employee; } @Autowired public void setEmployee(Employee emp) { // setting the employee employee = emp; } }
required=false made it not a required dependency.
The reason that we need optional dependencies is because Spring expects dependencies that are @Autowired to be available when the dependent bean is constructed. Otherwise, it will throw an error. Thanks to required=false, we get around this issue.
Summary
By using the @Autowired annotation, we save a few lines of code and also saves us some time as we don’t need to specify properties and constructor arguments.