Динамически выбирать bean без аннотации квалификатора

У меня есть служба, которая получает URL-адрес из пользовательского ввода, извлекает содержимое тела этого URL-адреса, применяет CSS и, наконец, возвращает результат в виде потока.

Сложность заключается в том, что у меня разные реализации в зависимости от URL-адреса, если URL-адрес не распознается, то используется реализация «по умолчанию». Для этого я использовал BeanFactory, чтобы выбрать правильную реализацию в среде выполнения.

@Service
@Qualifier("defaultHtmlToHtmlService")
public class DefaultHtmlToHtmlImpl implements HtmlToHtmlService {

    @Override
    public InputStream htmlToHtml(String url) throws IOException {
        Document document = Jsoup.connect(url).get();
        Element content = document.body();

        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        outputStream.write(content.outerHtml().getBytes());
        outputStream.close();

        return new ByteArrayInputStream(outputStream.toByteArray());
    }
}

@Component
public class BeanFactory {


private final HtmlToHtmlService defaultHtmlToHtmlService;

private final HtmlToHtmlService impl1;

private final HtmlToHtmlService impl2;

@Autowired
public BeanFactory(@Qualifier("defaultHtmlToHtmlImpl") HtmlToHtmlService defaultHtmlToHtmlService,
                   @Qualifier("impl1") HtmlToHtmlService impl1,
                   @Qualifier("impl2") HtmlToHtmlService impl2) {
    this.defaultHtmlToHtmlService = defaultHtmlToHtmlService;
    this.impl1 = impl1;
    this.impl2 = impl2;
}

public HtmlToHtmlService getHtmlToHtmlImpl(String url) {
    if (url.contains("some pattern")) {
        return impl1;
    } else if (url.contains("some other pattern")) {
        return impl2;
    } else {
        return defaultHtmlToHtmlService;
    }
}

Это работает нормально. Однако моя проблема в том, что я не хочу, чтобы моя BeanFactory делилась какой-либо информацией с остальными, но я не знаю, как ее отделить. В принципе, я хочу удалить @Qualifier аннотации, и мне не придется вручную вводить новые шаблоны URL-адресов в Bean Factory в будущем, когда я получу больше реализаций.

Я видел это может быть @PostConstruct аннотации или использование статических блоков может быть решением, но я действительно не уверен, как применить его в этом случае.

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *