Spring Beans and dependency injection
You are free to use any of the standard Spring Framework techniques to define your beans
and their injected dependencies. For simplicity, we often find that using @ComponentScan
to find your beans, in combination with @Autowired
constructor injection works well.
If you structure your code as suggested above (locating your application class in a root
package), you can add @ComponentScan
without any arguments. All of your application
components (@Component
, @Service
, @Repository
, @Controller
etc.) will be
automatically registered as Spring Beans.
Here is an example @Service
Bean that uses constructor injection to obtain a
required RiskAssessor
bean.
package com.example.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class DatabaseAccountService implements AccountService {
private final RiskAssessor riskAssessor;
@Autowired
public DatabaseAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
}
// ...
}
And if a bean has one constructor, you can omit the @Autowired
.
@Service
public class DatabaseAccountService implements AccountService {
private final RiskAssessor riskAssessor;
public DatabaseAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
}
// ...
}
Notice how using constructor injection allows the riskAssessor field to be marked
as final , indicating that it cannot be subsequently changed.
|