Bird
Raised Fist0
Spring Bootframework~10 mins

Field injection and why to avoid it in Spring Boot - Interactive Code Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to inject a dependency using field injection.

Spring Boot
public class UserService {
    @Autowired
    private [1] userRepository;
}
Drag options to blanks, or click blank then click option'
AAutowired
BuserRepository
CUserService
DUserRepository
Attempts:
3 left
💡 Hint
Common Mistakes
Using the variable name instead of the type.
Using the class itself instead of the dependency type.
2fill in blank
medium

Complete the code to inject a dependency using constructor injection instead of field injection.

Spring Boot
public class UserService {
    private final UserRepository userRepository;

    public UserService([1] userRepository) {
        this.userRepository = userRepository;
    }
}
Drag options to blanks, or click blank then click option'
AUserService
BUserRepository
CAutowired
DService
Attempts:
3 left
💡 Hint
Common Mistakes
Using the class name of the service instead of the dependency.
Forgetting to mark the constructor with @Autowired (optional in Spring Boot).
3fill in blank
hard

Fix the error in this field injection example by choosing the correct annotation to avoid issues.

Spring Boot
public class UserService {
    [1]
    private UserRepository userRepository;
}
Drag options to blanks, or click blank then click option'
A@Component
B@Inject
C@Autowired
D@Service
Attempts:
3 left
💡 Hint
Common Mistakes
Using @Component or @Service on fields instead of classes.
Using @Inject without proper configuration.
4fill in blank
hard

Fill both blanks to rewrite field injection as constructor injection to improve testability and immutability.

Spring Boot
public class UserService {
    private final UserRepository userRepository;

    public UserService([1] userRepository) {
        this.userRepository = [2];
    }
}
Drag options to blanks, or click blank then click option'
AUserRepository
Bthis.userRepository
CuserRepository
DUserService
Attempts:
3 left
💡 Hint
Common Mistakes
Assigning the field to itself instead of the parameter.
Using wrong parameter type.
5fill in blank
hard

Fill all three blanks to create a Spring component with constructor injection and avoid field injection pitfalls.

Spring Boot
@[1]
public class OrderService {
    private final OrderRepository orderRepository;

    public OrderService([2] orderRepository) {
        this.orderRepository = [3];
    }
}
Drag options to blanks, or click blank then click option'
AService
BOrderRepository
CorderRepository
DComponent
Attempts:
3 left
💡 Hint
Common Mistakes
Using @Component instead of @Service for service classes.
Mixing up parameter and field names in assignment.

Practice

(1/5)
1. What is a main reason to avoid using @Autowired directly on fields in Spring Boot?
easy
A. It disables Spring Boot auto-configuration
B. It causes syntax errors in the code
C. It requires manual object creation
D. It hides dependencies and makes testing harder

Solution

  1. Step 1: Understand field injection behavior

    Field injection uses @Autowired on fields, which hides the dependencies inside the class without showing them in the constructor.
  2. Step 2: Analyze impact on testing

    Because dependencies are hidden, it becomes harder to create test instances with mocks or stubs, reducing testability.
  3. Final Answer:

    It hides dependencies and makes testing harder -> Option D
  4. Quick Check:

    Hidden dependencies = avoid field injection [OK]
Hint: Hidden dependencies make testing tough, avoid field injection [OK]
Common Mistakes:
  • Thinking field injection causes syntax errors
  • Believing field injection disables auto-configuration
  • Assuming field injection requires manual object creation
2. Which of the following is the correct way to inject a dependency using constructor injection in Spring Boot?
easy
A. @Autowired private Service service;
B. Service service = new Service();
C. public MyClass(Service service) { this.service = service; }
D. @Autowired public void setService(Service service) { this.service = service; }

Solution

  1. Step 1: Identify constructor injection syntax

    Constructor injection requires a constructor that accepts the dependency as a parameter and assigns it to a field.
  2. Step 2: Match the correct code

    public MyClass(Service service) { this.service = service; } shows a constructor receiving Service and assigning it, which is the correct pattern.
  3. Final Answer:

    public MyClass(Service service) { this.service = service; } -> Option C
  4. Quick Check:

    Constructor injection = constructor with parameters [OK]
Hint: Constructor injection uses constructor parameters, not field annotations [OK]
Common Mistakes:
  • Confusing field injection with constructor injection
  • Using manual object creation instead of injection
  • Using setter injection when constructor injection is asked
3. Given this Spring Boot class using field injection:
public class MyService {
  @Autowired
  private Repository repo;

  public String getData() {
    return repo.fetch();
  }
}

What is a likely problem when writing unit tests for MyService?
medium
A. The getData() method will not compile
B. You cannot replace repo with a mock easily
C. The repo field will always be null at runtime
D. Spring Boot will throw a runtime exception on startup

Solution

  1. Step 1: Understand field injection impact on testing

    Field injection hides the dependency inside the private field, making it hard to inject a mock instance during unit tests.
  2. Step 2: Analyze testability of MyService

    Since repo is private and injected by Spring, test code cannot easily replace it with a mock, limiting test control.
  3. Final Answer:

    You cannot replace repo with a mock easily -> Option B
  4. Quick Check:

    Field injection blocks mock replacement [OK]
Hint: Field injection hides fields, blocking mock injection in tests [OK]
Common Mistakes:
  • Assuming compilation errors occur
  • Thinking Spring throws exceptions on field injection
  • Believing the field is always null at runtime
4. Identify the problem in this Spring Boot class using field injection:
public class UserService {
  @Autowired
  private UserRepository userRepository;

  public UserService() {}

  public User findUser(Long id) {
    return userRepository.findById(id).orElse(null);
  }
}
medium
A. Field injection hides dependencies making testing harder
B. Constructor is missing the @Autowired annotation
C. The userRepository field should be static
D. The findUser method should be static

Solution

  1. Step 1: Review injection style

    The class uses field injection with @Autowired on a private field, which hides dependencies.
  2. Step 2: Understand testing impact

    Because dependencies are hidden, it is harder to inject mocks or stubs for unit testing, reducing testability.
  3. Final Answer:

    Field injection hides dependencies making testing harder -> Option A
  4. Quick Check:

    Field injection = hidden dependencies = testing difficulty [OK]
Hint: Field injection hides dependencies, causing test problems [OK]
Common Mistakes:
  • Thinking constructor needs @Autowired always
  • Believing fields must be static for injection
  • Assuming methods must be static for injection
5. You have a Spring Boot service class that uses field injection:
public class OrderService {
  @Autowired
  private PaymentService paymentService;

  public boolean processOrder(Order order) {
    return paymentService.charge(order.getAmount());
  }
}

How would switching to constructor injection improve this class?
hard
A. It makes dependencies explicit and improves testability
B. It removes the need to annotate fields with @Autowired
C. It automatically creates new instances of dependencies
D. It allows Spring to inject dependencies without a constructor

Solution

  1. Step 1: Understand constructor injection benefits

    Constructor injection requires dependencies to be passed in explicitly, making them visible and clear in the class design.
  2. Step 2: Analyze testability improvements

    Explicit dependencies allow easy replacement with mocks or stubs during testing, improving testability and code clarity.
  3. Final Answer:

    It makes dependencies explicit and improves testability -> Option A
  4. Quick Check:

    Constructor injection = explicit dependencies + better tests [OK]
Hint: Constructor injection shows dependencies clearly, aiding tests [OK]
Common Mistakes:
  • Thinking constructor injection removes @Autowired completely
  • Believing constructor injection creates new instances automatically
  • Assuming Spring injects without constructor or annotations
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard