簡體   English   中英

Spring,注入僅包含特定 bean 的 bean 列表

[英]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 的理解,我會這樣做。

概括:

  1. 為每個實現集合創建一個 bean 方法。 在您的情況下,為包含 Validator1 和 Validator2 的List<Validator>創建一個 bean 方法,並創建第二個包含 Validator2 和 Validator3 的List<Validator>
  2. 使用@Qualifier 注入所需的列表。

代碼應該是這樣的:

@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM