A
B
uses methods of
creates
class UserService {
UserRepository userRepo = new UserRepository(...);
List<User> getActiveUsers() {
return userRepo.findAll().stream()
.filter(User::isActive)
.toList();
}
}class UserService {
UserRepository userRepo;
UserSerivce (UserRepository userRepo) {
this.userRepo = userRepo;
}
List<User> getActiveUsers() {
return userRepo.findAll().stream()
.filter(User::isActive)
.toList();
}
}A
B
uses methods of
X
create
create and inject B
A
uses methods of
X
create
create and inject B
interface
B
implements
impl.
B
Constructor
Method
Field /Property
Setter
Interface
Parameter
class UserService {
UserRepository userRepo;
UserService (UserRepository userRepo) {
this.userRepo = userRepo;
}
List<User> getUsers() {
return userRepo.findAll();
}
}UserRepository userRepository = new UserRepository();
UserService userService = new UserService(userRepository);ย constructor can become bloated with dependencies
known as constructor over-injection
class might be doing more than one thing
refactoring!
UserRepository userRepository = new UserRepository(userSerivce);
UserService userService = new UserService(userRepository);class UserService {
UserRepository userRepo;
void setUserRepo (UserRepository userRepo) {
this.userRepo = userRepo;
}
List<User> getUsers() {
return userRepo.findAll();
}
}UserService userService = new UserService();
UserRepository userRepository = new UserRepository(userService);
userService.setUserRepo(userRepository);similar to setter injection
dependency provided by injector method
defined in interface
dependent class (client) implements interface
plugin-based architecture
interface InjectUserRepo {
public void injectUserRepo(UserRepository userRepo);
}class UserService {
List<User> getUsers(UserRepository userRepo) {
return userRepo.findAll();
}
}class UserService {
UserRepository userRepo;
List<User> getUsers() {
return userRepo.findAll();
}
}UserRepository userRepo = new UserRepository();
UserService userService = new UserService();
userService.userRepo = userRepo;class UserService {
private UserRepository userRepo;
List<User> getUsers() {
return userRepo.findAll();
}
}UserRepository userRepo = new UserRepository();
UserService userService = new UserService();
Field userRepoField = userService.getClass()
.getDeclaredField("userRepo");
userRepoField.setAccessible(true);
userRepoField.set(userService, userRepo);
class UserService {
UserRepository userRepo;
UserSerivce (UserRepository userRepo) {
this.userRepo = userRepo;
}
}public class CliTool {
public static void main (String[] args) {
String endpoint = System.getenv("ENDPOINT");
RestClient restClient = new RestClient(endpoint);
UserService userService = new UserService(restClient);
userService.doSomething();
restClient.close();
}
}
โ๏ธย jens@openvalue.de
ย ย ย @jensknipper.de
๐ openvalue.eu