Hvad er en Spring Bean?

1. Oversigt

Bean er et nøglebegreb i Spring Framework. Som sådan er det afgørende at forstå denne opfattelse for at få fat i rammen og bruge den på en effektiv måde.

Desværre, der er ikke klare svar på et simpelt spørgsmål - hvad en Spring Bean egentlig er. Nogle forklaringer går på et så lavt niveau, at et stort billede går glip af, mens nogle er for vage.

Denne tutorial vil prøve at kaste lys over emnet startende med en beskrivelse i den officielle dokumentation.

2. Bønnedefinition

Her er en definition af bønner i Spring Framework-dokumentationen:

I foråret kaldes de objekter, der udgør rygraden i din applikation, og som styres af Spring IoC-beholderen. En bønne er et objekt, der instantieres, samles og på anden måde styres af en Spring IoC-container.

Denne definition er kortfattet og kommer til det punkt, men savner en vigtig ting - Spring IoC container. Lad os gå ned i kaninhullet for at se, hvad det er, og hvilke fordele det medfører.

3. Inversion af kontrol

Kort sagt, Inversion of Control eller kort sagt IoC en proces, hvor et objekt definerer dets afhængigheder uden at skabe dem. Dette objekt delegerer jobbet med at konstruere sådanne afhængigheder til en IoC-container.

Lad os starte med erklæringen om et par domæneklasser, før vi dykker ned i IoC.

3.1. Domæneklasser

Antag, at vi har en klassedeklaration:

offentlig klasse virksomhed {privat adresse adresse; offentligt selskab (adresse adresse) {this.address = adresse; } // getter, setter og andre egenskaber}

Denne klasse har brug for en samarbejdspartner af typen Adresse:

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

3.2. Traditionel tilgang

Normalt opretter vi objekter med deres klassers konstruktører:

Adresse-adresse = ny adresse ("High Street", 1000); Virksomhedsselskab = nyt selskab (adresse);

Der er ikke noget galt med denne tilgang, men ville det ikke være rart at styre afhængighederne på en bedre måde?

Forestil dig en applikation med snesevis eller endda hundreder af klasser. Nogle gange vil vi dele en enkelt forekomst af en klasse på tværs af hele applikationen, andre gange har vi brug for et separat objekt til hver brugssag og så videre.

At styre et sådant antal objekter er intet mindre end et mareridt. Det er her Inversion of Control kommer til undsætning.

I stedet for at konstruere afhængigheder i sig selv kan et objekt hente dets afhængigheder fra en IoC-container. Alt hvad vi skal gøre er at give containeren passende konfigurationsmetadata.

3.3. Bønnekonfiguration

Først og fremmest, lad os dekorere Selskab klasse med @Komponent kommentar:

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

Her er en konfigurationsklasse, der 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); }}

Konfigurationsklassen producerer en bønne af typen Adresse. Det bærer også @ComponentScan kommentar, som instruerer beholderen om at se efter bønner i pakken, der indeholder Selskab klasse.

Når en Spring IoC-container konstruerer objekter af disse typer, kaldes alle objekter Spring beans, da de administreres af IoC-containeren.

3.4. IoC i aktion

Da vi definerede bønner i en konfigurationsklasse, vi har brug for en forekomst af AnnotationConfigApplicationContext klasse til at opbygge en container:

ApplicationContext context = ny AnnotationConfigApplicationContext (Config.class);

En hurtig test verificerer eksistensen såvel som egenskabsværdierne for vores bønner:

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

Resultatet viser, at IoC-beholderen har oprettet og initialiseret bønner korrekt.

4. Konklusion

Denne vejledning gav en kort beskrivelse af springbønner og deres forhold til en IoC-beholder.

Den komplette kildekode til denne vejledning kan findes på GitHub.