Skip to content

What is better for injection? Field injection or constructor injection?

Notifications You must be signed in to change notification settings

Tilseroz/field-vs-constructor-injection

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 

Repository files navigation

CONSTRUCTOR INJECTION vs FIELD INJECTION

Testability

If we use CONSTRUCTOR INJECTION, we don't have to use Spring annotations, i.e. we don't have to create a Spring Context at all, so we have faster and cleaner tests. With FIELD INJECTION we have to create Spring Context hence it takes much longer to run the tests.

Cyclic Dependency detection

Cyclic dependencies can be easily detected and fixed with CONSTRUCTOR INJECTION. Cyclic dependencies are not easily detected with FIELD INJECTION.

Immutability

We can have (and we should, it's best practice) to have autowired fields final with CONSTRUCTOR INJECTION. It makes sense, since the fields won't ever change during the lifetime of an application. It also helps to avoid programming issues, because the compiler will complain if we have forgotten to initialize the field. Fields cannot be final with FIELD INJECTION.

Performance

Only part where FIELD INJECTION is better. Objects are created independently and fields are injected later using reflection. That means startup time is faster. In the CONSTRUCTOR INJECTION case all the beans must be created in the correct order of dependencies which increase the startup time.

Clean code

CONSTRUCTOR INJECTION forces developers to keep dependencies to a minimum, given that they see them in the constructor. FIELD INJECTION is very easy to add, and thus classes with 5 or more dependencies often appear. Yet if there are more than 3, we should start thinking about the fact that the architecture is not well-thought-out. One service should not do too much stuff.

Reflection

Spring must use reflection to inject private fields in case of FIELD INJECTION. If we inject with CONSTRUCTOR INJECTION, we do not have any reflection.

CONSTRUCTOR INJECTION forces us follow one of SOLID principles - Single Responsibility

A class should have only one responsibility. Constructor forces us to have fewer dependencies, so that means less functionality

Summary

Always use CONSTRUCTOR INJECTION.

About

What is better for injection? Field injection or constructor injection?

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages