Программно найти значение аннотации квалификатора компонента - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть класс, где я автоматически связал список типа

Class A{
   @Autowired
   List<Super> supers;
}

@Qualifier("B")
Class BSuperImpl implements Super{....}

@Qualifier("C")
Class CSuperImpl implements Super{....}

@Qualifier("D")
Class DSuperImpl  implements Super{....}

Теперь я хочу написать код в классе A, где я могу посмотреть на bean-компонент, основываясь на определителе, например: после, не делая мой бин осведомленным о контексте. Используя Spring MVC 4.3

Class A {

   @Autowired
   List<Super> supers;

   void process(String str){
       // Code to do supers.applyMethod(getTheBeanWithQualifierAs(str));
      }
}

1 Ответ

1 голос
/ 30 апреля 2020

Для чего стоит

@Service
public class A {

    @Autowired
    List<Super> supers;

    void process(String str) {
        for(Super sup : supers) {
            if(str.equals((sup.getClass().getAnnotation(Qualifier.class).value()))){
                // executes when the bean qualifier name and str matches.
            }
        }

    }
}

---- Еще одна попытка ----

Интерфейс

public interface Super {
    String getQualifier();
}

Пример реализации

@Service
@Qualifier(BSuperImpl.QUALIFIER)
public class BSuperImpl implements Super {

    static final String QUALIFIER = "B";

    @Override
    public String getQualifier() {
        return QUALIFIER;
    }

}

A

@Service
public class A {

    @Autowired
    Map<String,Super> supers;

    void process(String str) {
        System.out.println(supers);
        for(String beanName : supers.keySet()) {
            if(str.equals(supers.get(beanName).getQualifier())){
                // execute the logic 
            }
        }
    }
}

Когда от контейнера требуется не bean-компонент, а не путем внедрения зависимостей, вам так или иначе потребуется ссылаться на контекст приложения.

При таком подходе использование @Qualifier не является обязательным. Использование map должно продемонстрировать возможность того, что beanName также может быть передано в качестве параметра методу.

...