23.9.2020
Spring Dependency Injection
Dependency Injection
Autowired
@Service
public class SendWelcomeMail {
@Autowired
private MailService mailService;
...
}
- Works like magic
- Has to much magic for Testing
- Autowiring mode
byType
->
Constructor Argument Resolution
@Service
@RequiredArgsConstructor
public class SendWelcomeMail {
private final MailService mailService;
...
}
How about Configuration Properties?
Value
application.properties
mail.batchSize=10
@Service
public class SendWelcomeMail {
@Value("${mail.batchSize}")
private int batchSize;
...
}
- No type safety
- No fun to test like
@Autowired
@Bean
Build the Bean yourself as part of a @Configuration
.
@Configuration
@ConfigurationProperties(prefix = "mail")
public class MailConfiguration {
private int batchSize;
@Bean
public SendWelcomeMail build() {
return new SendWelcomeMail(batchSize);
}
}
@Service
@RequiredArgsConstructor
public class SendWelcomeMail {
private final int batchSize;
...
}
-
- Type safety
-
- Manual work
-
- Dependency where a Configuration cares about who uses it
@value with Spring SpEL Bean
Flip the relation an let the Service say what configuration it needs and Spring will do the rest.
@Configuration
@ConfigurationProperties(prefix = "mail")
public class MailConfiguration {
private int batchSize
}
@Service
@RequiredArgsConstructor
public class SendWelcomeMail {
@Value("#{mailConfiguration.batchSize}")
private final int batchSize;
...
}
lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Value
- Best of both worlds and like bean
- https://projectlombok.org/features/constructor
Standort Hannover
newcubator GmbH
Bödekerstraße 22
30161 Hannover
Standort Dortmund
newcubator GmbH
Westenhellweg 85-89
44137 Dortmund