Wyszukiwanie implementacji API

Wyszukiwanie implementacji API
PM
  • Rejestracja:prawie 8 lat
  • Ostatnio:7 miesięcy
  • Postów:30
0

Szukam sposobu łatwego instancjonowania oraz rozszerzania implementacji danego API.
Założenie jest takie: jest sobie moduł który używa ustalonego API. Teraz chciałbym mieć możliwość jak najbardziej bezinwazyjnego dodawania nowych implementacji tego API tak aby nie ingerować w kod modułu który go używa. Moduł wie na podstawie requestu której implementacji użyć.

Wymyśliłem coś takiego:
Każda nowa implementacja będzie implementowć API w osobnym jarze. Jary będą podpięte do modułu jako dependencje. I teraz moduł refleksją będzie instancjonować konkretną implentację
np. Class.forName(className).newInstance()

Pełne nazwy klas będą zdefiniowane w zmiennych środowiska:
reuestType1 = com.xyz.className1
requestType2 = com.xyz.className2
requestType3 = com.xyz.className3

Jakie widzicie sposoby rozwiązania tego inaczej ?

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

A po co w ogóle ta refleksja? Nie możesz po prostu zrobić sobie przy starcie aplikacji mapy string->interface? Jak używasz stringa i te implementacje to beany to w ogóle taką mapę może ci zrobić automatycznie.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
PM
Ale wtedy musiałbym przy dodawaniu nowej implementacji(przy założeniu że każda ma unikalną nazwę) wskazywać która implementacje użyc, skąd spirng będzie wiedziął ktora implentacje wybrać...ale tak czy inaczej nie chciałem używac springa
Shalom
Wat? Nie rozumiem niby czemu i jak. Wystarczy że zrobisz sobie dispatcher który z requestu pobiera nazwę implementacji do użycia i wyciąga ją z mapy. Dokładnie tak jak chciałeś to zrobić, tylko że nie kombinujesz z refleksją :)
Charles_Ray
  • Rejestracja:około 17 lat
  • Ostatnio:5 minut
  • Postów:1874
0

To jakiś overengineering. Dopóki wprowadzasz kompatybilne zmiany, możesz dowoli zmieniać implementację API. W przypadku zmian niekompatybilnych poczytaj o wersjonowaniu API.


”Engineering is easy. People are hard.” Bill Coughran
Zobacz pozostałe 4 komentarze
Charles_Ray
Super, ale jak dostarczysz te implementacje bez ingerencji w kod? Chyba, że nie zrozumiałem jaki problem ma autor :)
Shalom
No jeśli te implementacje będą beanami springowymi, to nie będziesz musiał nic robić. Spring je sobie zinstancjonuje i wstrzyknie do mapy. Dorzucasz jara do classpath, restartujesz i już.
Charles_Ray
Ok, już widzę, zasugerowałem się tymi jarami. Też bym zrobił taką mapę i schował ją w komponencie, który mapuje Stringa na konkretna implementację.
PM
Ok, faktycznie za pomocą Springa można by to tak rozwiązać, natomiast Springa w projekcie nie wykorzystuję i raczej nie będę go wciągał tylko do tego celu.
Charles_Ray
Jakikolwiek kontener DI albo pozostaje skanowanie classpath mechanizmami wbudowanymi w Jave. Zauważ, że problem tez nie jest standardowy, a szkoda czasu na wymyślanie koła od nowa.
catom
  • Rejestracja:około 6 lat
  • Ostatnio:ponad 2 lata
  • Postów:58
1

Ew. ktoś może w końcu by wykorzystał Java 9 Modules. :)

Wówczas trzeba odpowiednio zdefiniować serwisy i ich implementacje, a później ładować je ServiceLoaderem (można bez problemu to wywołać w runtime, bez potrzeby restartu).
Byłem kiedyś na prezentacji Sandera Maka (współautora Java 9 Modularity) i pokazywał przykład aplikacji, w której stosował różne algorytmy obliczania liczby sylab w tekście i usuwał / dodawał nowe implementacje w runtime.

Kod: https://github.com/java9-modularity/easytext
Slajdy z prezentacji: https://www.slideshare.net/SanderMak/java-9-modularity-in-action

edytowany 2x, ostatnio: catom
Shalom
Tak, już 10 lat temu ludzie to proponowali pod nazwą OSGi. Umarło ;)
KamilAdam
Apache Karaf wiecznie żywy. Co prawda jakoś czas temu go usuwałem z jednego projektu, ale na pewno gdzieś tam na świecie dalej ludzie tego używają by dynamicznie ładować jary bez restartu. Nawet jeśli w czasach fat jarów, mikroservisów i bezstanowcych aplikacji nie ma to żadnego sensu
Shalom
Niestety tak, np. jakiś geniusz wybrał to na podstawę dla EGS-CC, a to mógł być taki fajny projekt ;]
KamilAdam
Coż, co jest dobre dla projektów kosmicznych niekoniecznie jest dobre dla aplikacji działającej w chmurze, a co jest dobre dla aplikacji działającej w chmurze nie koniecznie jest dobre dla projektu kosmicznego. Bardzo lubię Apache Karafa, ale dla zwykłej aplikacji, którą można zrestartować, nie bardzo widzę sens dodawać narzut silnika do dynamicznego ładowania modułów. Z drugiej strony bardzo bym chciał, żeby coś takiego miał IntelliJ IDEA
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)