HopeKing
HopeKing

Reputation: 3503

Methods of Autowiring in Spring - Difference between the two possible alternatives below

I have a basic Auto-wiring Question. I see the following two implementations that are possible in Spring auto-wiring

Method1

public class SimpleMovieLister {

private MovieFinder movieFinder;

@Autowired
public void setMovieFinder(MovieFinder movieFinder) {
    this.movieFinder = movieFinder;
}
// ...
}

Method2

public class SimpleMovieLister {

@Autowired
private MovieFinder movieFinder;
}

My understanding is that both are the same and I use a lot of Method2 in my code. What are the situations in which Method1 is useful ? Or is it just a case of Spring evolution and we have both possible ways in which to implement.

Sorry, if the question is too basic, but I need to get this cleared up

Upvotes: 2

Views: 4586

Answers (2)

Kyle Anderson
Kyle Anderson

Reputation: 7031

Method 1 is Setter Injection.

Method 2 is Field Injection.

A 3rd method is Constructor Injection

Example:

public class SimpleMovieLister {

private MovieFinder movieFinder;

@Autowired
public SimpleMovieLister(MovieFinder movieFinder) {
    this.movieFinder = movieFinder;
}
// ...
}

Method 3, Constructor Injection is preferred because it makes testing significantly easier since you can pass in the required dependency.

Also, if your Bean only has 1 Constructor, then you can omit the @Autowired annotation. Spring will automatically choose that constructor method when creating the bean.

A good snippet from the docs:

The Spring team generally advocates constructor injection as it enables one to implement application components as immutable objects and to ensure that required dependencies are not null. Furthermore constructor-injected components are always returned to client (calling) code in a fully initialized state. As a side note, a large number of constructor arguments is a bad code smell, implying that the class likely has too many responsibilities and should be refactored to better address proper separation of concerns.

Setter injection should primarily only be used for optional dependencies that can be assigned reasonable default values within the class. Otherwise, not-null checks must be performed everywhere the code uses the dependency. One benefit of setter injection is that setter methods make objects of that class amenable to reconfiguration or re-injection later. Management through JMX MBeans is therefore a compelling use case for setter injection.

Use the DI style that makes the most sense for a particular class. Sometimes, when dealing with third-party classes for which you do not have the source, the choice is made for you. For example, if a third-party class does not expose any setter methods, then constructor injection may be the only available form of DI.

Upvotes: 5

Anthony Liriano
Anthony Liriano

Reputation: 599

https://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html

Method 1 is setter Injection

Setter injection should primarily only be used for optional dependencies that can be assigned reasonable default values within the class. Otherwise, not-null checks must be performed everywhere the code uses the dependency. One benefit of setter injection is that setter methods make objects of that class amenable to reconfiguration or re-injection later.

Method 2 is field Injection

Upvotes: 0

Related Questions