[英]Spring, injecting a list of beans with only specific beans included
在 Spring 中,當我注入一個 beans 列表時,我只想注入接口的特定實現,當從不同的地方使用時。 這可能嗎? 配置這個的最干凈的方法是什么? 例如,我有以下驗證器:
public interface Validator {
Optional<Error> validate(MultipartFile file);
}
public class Validator1 implements Validator {
public Optional<Error> validate(MultipartFile file) {
// do stuff
}
}
public class Validator2 implements Validator {
public Optional<Error> validate(MultipartFile file) {
// do stuff
}
}
public class Validator3 implements Validator {
public Optional<Error> validate(MultipartFile file) {
// do stuff
}
}
然后我有一個類似於此的驗證服務:
public class ValidationService {
@Autowired
private List<Validator> validators;
public List<Error> validate(MultipartFile file) {
List<Error> errors = new ArrayList<>();
validators.forEach(v -> {
Optional<Error> error = v.validate(file);
if (error.isPresent()) {
errors.add(error.get());
}
});
return errors;
}
}
然后我有一些使用 ValidationService 的服務,例如:
public class Service1 {
@Autowired
private ValidationService validationService;
public void doStuff(MultipartFile file) {
...
validationService.validate(file);
...
}
}
public class Service2 {
@Autowired
private ValidationService validationService;
public void doStuff(MultipartFile file) {
...
validationService.validate(file);
...
}
}
當Service1 調用validate 時,我只想將Validator1 和Validator2 注入到ValidatorService 中。 當Service2調用validate時,我只希望Validator2和Validator3已經注入到ValidatorService中。
希望我已經解釋清楚了。 在此先感謝您提供的任何幫助。
使用 @Qualifier 注釋像這樣創建 bean --
@Qualifier("validator1")
public class Validator1 implements Validator {
public Optional<Error> validate(MultipartFile file) {
// do stuff
}
}
@Qualifier("validator2")
public class Validator2 implements Validator {
public Optional<Error> validate(MultipartFile file) {
// do stuff
}
}
@Qualifier("validator3")
public class Validator3 implements Validator {
public Optional<Error> validate(MultipartFile file) {
// do stuff
}
}
並像這樣注入它---
@Autowired("validator1")
private ValidationService validationService;
更新
您還可以像這樣為所有驗證器創建一個 bean 集合 -
@Bean("validators")
public List<Validator> validatorList(Validator1 validator1, Validator2 validator2, Validator3 validator3) {
return Arrays.asList(validator1, validator2, validator3);
}
並將列表 bean 注入為 --
@Autowired("validators")
private List<Validator> validators;
查看此頁面以獲得詳細示例 - https://www.baeldung.com/spring-injecting-collections
這可能不是執行此操作的最佳方法。 根據我目前對 Spring 的理解,我會這樣做。
概括:
List<Validator>
創建一個 bean 方法,並創建第二個包含 Validator2 和 Validator3 的List<Validator>
。代碼應該是這樣的:
@Configuration
public class ValidatorLists
{
private void getAndAddBean(
final ApplicationContext applicationContext,
final List<Validator> list,
final String beanName)
{
final Validator bean;
bean = applicationContext.getBean(beanName);
if (bean != null)
{
list.add(bean);
}
}
@Bean("ValidatorList1")
public List<Validator> validatorList1(final ApplicationContext applicationContext)
{
Validator bean;
final List<Validator> returnValue = new LinkedList<>();
getAndAddBean(applicationContext, returnValue, "ValidatorImpl1");
getAndAddBean(applicationContext, returnValue, "ValidatorImpl2");
return returnValue;
}
@Bean("ValidatorList2")
public List<Validator> validatorList2(final ApplicationContext applicationContext)
{
Validator bean;
final List<Validator> returnValue = new LinkedList<>();
getAndAddBean(applicationContext, returnValue, "ValidatorImpl2");
getAndAddBean(applicationContext, returnValue, "ValidatorImpl3");
return returnValue;
}
}
然后通過限定符引用列表。
@Autowired
@Qualifier("ValidatorList1")
private List<Validator> validators;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.