У меня есть служба, которая получает 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
аннотации или использование статических блоков может быть решением, но я действительно не уверен, как применить его в этом случае.