Hva er en Spring Bean?

1. Oversikt

Bean er et nøkkelkonsept i Spring Framework. Som sådan er det viktig å forstå dette begrepet for å få tak i rammeverket og bruke det på en effektiv måte.

Dessverre, det er ikke klare svar på et enkelt spørsmål - hva en vårbønne egentlig er. Noen forklaringer går til et så lavt nivå at et stort bilde blir savnet, mens noen er for vage.

Denne opplæringen vil prøve å belyse temaet, og starte med en beskrivelse i den offisielle dokumentasjonen.

2. Bean Definisjon

Her er en definisjon av bønner i Spring Framework-dokumentasjonen:

På våren kalles objektene som danner ryggraden i applikasjonen din og som administreres av Spring IoC-beholderen. En bønne er et objekt som blir instantiert, samlet og på annen måte administrert av en Spring IoC container.

Denne definisjonen er kortfattet og kommer til poenget, men savner en viktig ting - Spring IoC container. La oss gå ned i kaninhullet for å se hva det er og fordelene det gir.

3. Inversjon av kontroll

Enkelt sagt, Inversion of Control, eller kort sagt IoC en prosess der et objekt definerer sine avhengigheter uten å skape dem. Dette objektet delegerer jobben med å konstruere slike avhengigheter til en IoC-container.

La oss starte med erklæringen om et par domeneklasser før vi dykker ned i IoC.

3.1. Domeneklasser

Anta at vi har en klassedeklarasjon:

offentlig klasse Company {privat adresse adresse; offentlig selskap (adresse adresse) {this.address = adresse; } // getter, setter og andre eiendommer}

Denne klassen trenger en samarbeidspartner av typen Adresse:

offentlig klasse Adresse {privat String street; privat int nummer; public Address (String street, int number) {this.street = street; dette.nummer = antall; } // getters og setters}

3.2. Tradisjonell tilnærming

Normalt lager vi objekter med deres klassers konstruktører:

Adresse-adresse = ny adresse ("High Street", 1000); Firma selskap = nytt selskap (adresse);

Det er ingenting galt med denne tilnærmingen, men ville det ikke vært fint å håndtere avhengighetene på en bedre måte?

Tenk deg en applikasjon med dusinvis eller hundrevis av klasser. Noen ganger ønsker vi å dele en enkelt forekomst av en klasse på tvers av hele applikasjonen, andre ganger trenger vi et eget objekt for hver brukstilfelle, og så videre.

Å håndtere et slikt antall objekter er intet mindre enn et mareritt. Det er her Inversion of Control kommer til unnsetning.

I stedet for å konstruere avhengigheter av seg selv, kan et objekt hente sine avhengigheter fra en IoC-beholder. Alt vi trenger å gjøre er å gi beholderen passende konfigurasjonsmetadata.

3.3. Bønnekonfigurasjon

Først av, la oss dekorere Selskap klasse med @Komponent kommentar:

@Component public class Company {// dette organet er det samme som før}

Her er en konfigurasjonsklasse som leverer bønnemetadata til en IoC-container:

@Configuration @ComponentScan (basePackageClasses = Company.class) public class Config {@Bean public Address getAddress () {return new Address ("High Street", 1000); }}

Konfigurasjonsklassen produserer en bønne av typen Adresse. Den bærer også @ComponentScan merknad, som instruerer beholderen om å lete etter bønner i pakken som inneholder Selskap klasse.

Når en Spring IoC-container konstruerer objekter av disse typene, kalles alle objektene Spring bønner ettersom de administreres av IoC-containeren.

3.4. IoC i aksjon

Siden vi definerte bønner i en konfigurasjonsklasse, vi trenger en forekomst av AnnotationConfigApplicationContext klasse for å bygge opp en container:

ApplicationContext context = new AnnotationConfigApplicationContext (Config.class);

En rask test verifiserer eksistensen så vel som eiendomsverdiene til våre bønner:

Firma selskap = context.getBean ("selskap", Company.class); assertEquals ("High Street", company.getAddress (). getStreet ()); assertEquals (1000, company.getAddress (). getNumber ());

Resultatet viser at IoC-beholderen har opprettet og initialisert bønner riktig.

4. Konklusjon

Denne opplæringen ga en kort beskrivelse av vårbønner og deres forhold til en IoC-beholder.

Den komplette kildekoden for denne opplæringen finner du på GitHub.