Routing
Routing in webforJ with Spring toimii täsmälleen samalla tavalla kuin tavallisissa webforJ-sovelluksissa. Käytät edelleen @Route-annotaatiota reittien määrittämiseen, samoja navigointimalleja ja samaa reittielämää. Ainoa ero on, että kun Spring on läsnä, reittisi voivat myös vastaanottaa Spring-beaneja konstruktorin injektoinnin kautta.
Kun navigoit reitille, webforJ luo reittiesimerkin - mutta kun Spring on luokkapolussa, se käyttää Springin konttia riippuvuuksien ratkaisemiseen. Tämä tarkoittaa, että reittisi voivat käyttää kaiken Springin ekosysteemin voimaa (palvelut, varastot, mukautetut beanit) säilyttäen tuttavan webforJ-reittikäyttäytymisen.
Kattavan ymmärryksen saamiseksi riippuvuuksien injektointimalleista ja Springin IoC-kontista, katso Springin virallinen riippuvuuksien injektoinnin dokumentaatio.
Kuinka webforJ luo reittejä Springin avulla
webforJ käsittelee reittien luomista eri tavalla, kun Spring on läsnä. Kehitysympäristön objektin luomismekanismi havaitsee Spring Bootin luokkapolussa ja delegoi Springin AutowireCapableBeanFactory -toiminnolle instanssien luomisen riippuvuuden injektoinnilla.
Luokille, jotka löydetään @Routify-skannauksen kautta, webforJ luo aina uusia instansseja eikä koskaan käytä olemassa olevia Spring-beaneja. Jokainen käyttäjän navigointi saa puhtaan reittiesimerkin ilman jaettua tilaa. Luomisprosessi:
- Käyttäjä navigoi reitille
- webforJ pyytää uutta instanssia (ohittaen kaikki olemassa olevat Spring-bean määrittelyt)
- Springin tehdas luo instanssin ja injektoi konstruktorin riippuvuudet
- Reitti alustetaan kaikkien riippuvuuksien tyydyttämiseksi
Tämä käyttäytyminen on tarkoituksellista ja eroaa tyypillisistä Spring-beaneista. Vaikka rekisteröisit reitin Spring-beanina @Component-annotaatiolla, webforJ ohittaa kyseisen bean-määrittelyn ja luo uuden instanssin jokaiselle navigoinnille.
Spring-beanien käyttö reiteissä
Reittiluokkasi eivät vaadi Spring-annotaatioita. Pelkkä @Route-annotaatio mahdollistaa sekä reittien löytymisen että riippuvuuksien injektoinnin:
@Route("/dashboard")
public class DashboardView extends Composite<Div> {
private final Div self = getBoundComponent();
private final MetricsService metricsService;
private final UserRepository userRepository;
public DashboardView(MetricsService metricsService, UserRepository userRepository) {
this.metricsService = metricsService;
this.userRepository = userRepository;
// Käytä injektoituja palveluja UI:n rakentamiseen
Div metricsPanel = new Div();
metricsPanel.setText(metricsService.getCurrentMetrics());
self.add(metricsPanel);
}
}
Konstruktorin voi vastaanottaa:
- Palvelut, jotka on merkitty
@Service,@Repositorytai@Component - Spring Data -varastot (
JpaRepository,CrudRepository) - Määritysarvot
@Value-annotaatioiden kautta - Spring-infrastruktuurin beanit (
ApplicationContext,Environment) - Mikä tahansa bean, joka on rekisteröity Spring-kontextiin
Töissä oleva esimerkki
Tämä esimerkki havainnollistaa täydellistä riippuvuuksien injektoinnin skenaariota, jossa Spring-palvelu injektoidaan webforJ-reittiin. Palvelu hallitsee liiketoimintalogiikkaa samalla kun reitti hoitaa UI-esityksen.
Ensiksi, määritä vakio Spring-palvelu käyttäen @Service-annotaatiota. Tämä palvelu hallitaan Springin kontissa ja se on saatavilla injektoitavaksi:
@Service
public class RandomNumberService {
public Integer getRandomNumber() {
return (int) (Math.random() * 100);
}
}
@Route("/")
public class HelloWorldView extends Composite<FlexLayout> {
private final FlexLayout self = getBoundComponent();
private Button btn = new Button("Generoi satunnainen numero");
public HelloWorldView(RandomNumberService service) {
self.setDirection(FlexDirection.COLUMN);
self.setMaxWidth(300);
self.setStyle("margin", "1em auto");
btn.setPrefixComponent(TablerIcon.create("dice"))
.setTheme(ButtonTheme.GRAY)
.addClickListener(e -> {
Toast.show("Uusi satunnainen numero on " + service.getRandomNumber(), Theme.SUCCESS);
});
self.add(btn);
}
}
Tässä esimerkissä RandomNumberService on vakio Spring-palvelubean. HelloWorldView -reitti julistaa sen konstruktorin parametrina, ja Spring tarjoaa automaattisesti palveluinstanssin, kun webforJ luo reitin.
Huomaa, että reittiluokka käyttää vain @Route-annotaatiota - mitään Springin stereotypioita, kuten @Component tai @Controller, ei tarvita. Kun käyttäjä navigoi juuripolkuun /, webforJ:
- Luo uuden instanssin
HelloWorldView - Pyytää Springiä ratkaisemaan
RandomNumberService-riippuvuuden - Siirtää palvelun konstruktorille
- Reitti käyttää injektoitua palvelua nappien klikkausten käsittelyyn
Tämä malli toimii minkä tahansa Spring-beanin kanssa - palvelut, varastot, kokoonpanoluokat tai mukautetut komponentit. Riippuvuuksien injektointi tapahtuu läpinäkyvästi, jolloin voit keskittyä UI:si rakentamiseen, kun Spring hallitsee kytkentää.