Wyszukiwanie implementacji API

Odpowiedz Nowy wątek
2020-01-23 16:48

Rejestracja: 3 lata temu

Ostatnio: 3 miesiące temu

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 ?

Pozostało 580 znaków

2020-01-23 16:53
Moderator

Rejestracja: 16 lat temu

Ostatnio: 1 minuta temu

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.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
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 - p_maciek 2020-01-23 17:44
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ą :) - Shalom 2020-01-23 18:12
Ok, racja. - p_maciek 2020-01-23 22:20

Pozostało 580 znaków

2020-01-23 16:54

Rejestracja: 12 lat temu

Ostatnio: 13 minut temu

0

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


IT menedżer
Pokaż pozostałe 4 komentarze
Super, ale jak dostarczysz te implementacje bez ingerencji w kod? Chyba, że nie zrozumiałem jaki problem ma autor :) - Charles_Ray 2020-01-23 19:33
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ż. - Shalom 2020-01-23 19:42
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ę. - Charles_Ray 2020-01-23 19:43
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. - p_maciek 2020-01-23 22:19
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. - Charles_Ray 2020-01-23 22:29

Pozostało 580 znaków

2020-01-26 18:10

Rejestracja: 1 rok temu

Ostatnio: 1 miesiąc temu

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/Sa[...]k/java-9-modularity-in-action

edytowany 2x, ostatnio: catom, 2020-01-26 18:11
Tak, już 10 lat temu ludzie to proponowali pod nazwą OSGi. Umarło ;) - Shalom 2020-01-26 21:07
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 - KamilAdam 2020-01-27 09:06
Niestety tak, np. jakiś geniusz wybrał to na podstawę dla EGS-CC, a to mógł być taki fajny projekt ;] - Shalom 2020-01-27 09:22
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 - KamilAdam 2020-01-27 10:24

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0