Oprettelse af en brugerdefineret starter med Spring Boot

1. Oversigt

Spring Core Boot-udviklerne giver startere til de fleste af de populære open source-projekter, men vi er ikke begrænset til disse.

Vi kan også skrive vores egne brugerdefinerede startere. Hvis vi har et internt bibliotek til brug inden for vores organisation, ville det være en god praksis at også skrive en starter til det, hvis det skal bruges i Spring Boot-sammenhæng.

Disse startere gør det muligt for udviklere at undgå langvarig konfiguration og hurtigt starte deres udvikling. Men med mange ting, der sker i baggrunden, bliver det nogle gange svært at forstå, hvordan en kommentar eller bare inkluderer en afhængighed i pom.xml muliggør så mange funktioner.

I denne artikel afmystificerer vi Spring Boot-magien for at se, hvad der foregår bag kulisserne. Derefter bruger vi disse koncepter til at skabe en starter til vores eget brugerdefinerede bibliotek.

2. Afmystificering af Spring Boot's autokonfiguration

2.1. Automatiske konfigurationsklasser

Når Spring Boot starter, ser det efter en fil med navnet forår. fabrikker i klassestien. Denne fil findes i META-INF vejviser. Lad os se på et uddrag af denne fil fra projektet spring-boot-autoconfigure:

# Auto-konfigurer org.springframework.boot.autoconfigure.EnableAutoConfiguration = \ org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration, \ org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, \ org.springframework. MongoAutoConfiguration, \ org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration

Denne fil kortlægger et navn til forskellige konfigurationsklasser, som Spring Boot vil prøve at køre. Så som pr. Dette uddrag, vil Spring Boot forsøge at køre alle konfigurationsklasser til RabbitMQ, Cassandra, MongoDB og Hibernate.

Hvorvidt disse klasser rent faktisk kører, afhænger af tilstedeværelsen af ​​afhængige klasser på klassestien. For eksempel, hvis klasserne for MongoDB findes på klassestien, MongoAutoConfiguration kører, og alle mongorelaterede bønner initialiseres.

Denne betingede initialisering er aktiveret af @ConditionalOnClass kommentar. Lad os se på kodestykket fra MongoAutoConfiguration klasse for at se dens anvendelse:

@Configuration @ConditionalOnClass (MongoClient.class) @EnableConfigurationProperties (MongoProperties.class) @ConditionalOnMissingBean (type = "org.springframework.data.mongodb.MongoDbFactory") offentlig klasse MongoAutoConfiguration {// konfigurationskode}

Nu hvordan - hvis den MongoClient er tilgængelig på klassestien - denne konfigurationsklasse kører udfyldte Spring bønnefabrikken med en MongoClient initialiseret med standardkonfigurationsindstillinger.

2.2. Brugerdefinerede egenskaber fra application.properties Fil

Spring Boot initialiserer bønnerne ved hjælp af nogle forudkonfigurerede standardindstillinger. For at tilsidesætte disse standardindstillinger erklærer vi dem generelt i application.properties fil med et specifikt navn. Disse egenskaber afhentes automatisk af Spring Boot-containeren.

Lad os se, hvordan det fungerer.

I kodestykket til MongoAutoConfiguration, @EnableConfigurationProperties annotering erklæres med MongoEjendomme klasse, der fungerer som beholderen for brugerdefinerede egenskaber:

@ConfigurationProperties (prefix = "spring.data.mongodb") offentlig klasse MongoProperties {private String vært; // andre felter med standard getters og setters}

Præfikset plus feltnavnet gør navnene på egenskaberne i application.properties fil. Så for at indstille vært til MongoDB behøver vi kun at skrive følgende i egenskabsfilen:

spring.data.mongodb.host = localhost

Tilsvarende kan værdier for andre felter i klassen indstilles ved hjælp af egenskabsfilen.

3. Oprettelse af en brugerdefineret starter

Baseret på begreberne i afsnit 2 skal vi skrive følgende komponenter for at oprette en brugerdefineret starter:

  1. En automatisk konfiguration af klasse til vores bibliotek sammen med en egenskabsklasse til brugerdefineret konfiguration.
  2. En starter pom at hente afhængighederne i biblioteket og autokonfigurationsprojektet.

Til demonstration har vi oprettet et simpelt hilsenbibliotek, der tager en hilsenbesked til forskellige tidspunkter af dagen som konfigurationsparametre og sender hilsenbeskeden. Vi opretter også en prøve Spring Boot-applikation for at demonstrere brugen af ​​vores autokonfigurations- og startmoduler.

3.1. Autokonfigurationsmodulet

Vi kalder vores autokonfigurationsmodul greeter-spring-boot-autoconfigure. Dette modul har to hovedklasser, dvs. GreeterEjendomme som gør det muligt at indstille brugerdefinerede egenskaber igennem application.properties fil og GreeterAutoConfiguartion som vil skabe bønnerne til hilsen bibliotek.

Lad os se på koden for begge klasser:

@ConfigurationProperties (prefix = "baeldung.greeter") offentlig klasse GreeterProperties {private String-brugernavn; privat String morningMessage; privat streng eftermiddag besked; privat String aftenMeddelelse; privat String nightMessage; // standard getters og setter}
@Configuration @ConditionalOnClass (Greeter.class) @EnableConfigurationProperties (GreeterProperties.class) offentlig klasse GreeterAutoConfiguration {@Autowired private GreeterProperties greeterProperties; @Bean @ConditionalOnMissingBean offentlig GreetingConfig greeterConfig () {String brugernavn = greeterProperties.getUserName () == null? System.getProperty ("bruger.navn"): greeterProperties.getUserName (); // .. GreetingConfig greetingConfig = ny GreetingConfig (); greetingConfig.put (USER_NAME, brugernavn); // ... return greetingConfig; } @Bean @ConditionalOnMissingBean public Greeter greeter (GreetingConfig greetingConfig) {returner ny Greeter (greetingConfig); }}

Vi skal også tilføje en forår. fabrikker fil i src / main / resources / META-INF bibliotek med følgende indhold:

org.springframework.boot.autoconfigure.EnableAutoConfiguration = \ com.baeldung.greeter.autoconfigure.GreeterAutoConfiguration

Ved opstart af applikationen, GreeterAutoConfiguration klasse kører, hvis klassen Greeter er til stede i klassestien. Hvis det køres med succes, udfyldes det Spring-applikationskonteksten med GreeterConfig og Greeter bønner ved at læse egenskaberne via GreeterEjendomme klasse.

Det @ConditionalOnMissingBean annotering vil sikre, at disse bønner kun oprettes, hvis de ikke allerede findes. Dette gør det muligt for udviklere at tilsidesætte de automatisk konfigurerede bønner ved at definere deres egne i en af @Konfiguration klasser.

3.2. Opretter pom.xml

Lad os nu oprette starteren pom som bringer afhængighederne til det automatiske konfigurationsmodul og greeter-biblioteket.

I henhold til navngivningskonventionen skal alle startere, der ikke administreres af det centrale Spring Boot-team, starte med biblioteksnavnet efterfulgt af suffikset -spring-boot-starter. Så vi kalder vores starter som greeter-spring-boot-starter:

 4.0.0 com.baeldung greeter-spring-boot-starter 0.0.1-SNAPSHOT UTF-8 0.0.1-SNAPSHOT 2.2.6.RELEASE org.springframework.boot spring-boot-starter $ {spring-boot.version} com .baeldung greeter-spring-boot-autoconfigure $ {project.version} com.baeldung greeter $ {greeter.version} 

3.3. Brug af starteren

Lad os skabe greeter-spring-boot-sample-app som vil bruge starteren. I pom.xml vi er nødt til at tilføje det som en afhængighed:

 com.baeldung greeter-spring-boot-starter $ {greeter-starter.version} 

Spring Boot konfigurerer automatisk alt, og vi har en Greeter bønne klar til at blive injiceret og brugt.

Lad os også ændre nogle af standardværdierne for GreeterEjendomme ved at definere dem i application.properties fil med baeldung.greeter præfiks:

baeldung.greeter.userName = Baeldung baeldung.greeter.afternoonMessage = Woha \ Eftermiddag

Lad os endelig bruge Greeter bønne i vores ansøgning:

@SpringBootApplication offentlig klasse GreeterSampleApplication implementerer CommandLineRunner {@Autowired private Greeter greeter; public static void main (String [] args) {SpringApplication.run (GreeterSampleApplication.class, args); } @ Override public void run (String ... args) kaster undtagelse {String message = greeter.greet (); System.out.println (besked); }}

4. Konklusion

I denne hurtige vejledning fokuserede vi på at udrulle en brugerdefineret Spring Boot-starter, og på hvordan disse startere sammen med autokonfigurationsmekanismen fungerer i baggrunden for at eliminere en masse manuel konfiguration.

Den komplette kildekode til alle de moduler, vi oprettede i denne artikel, kan findes på GitHub.