spring-boot
Paketskanning
Sök…
Introduktion
I det här ämnet kommer jag att övervaka vårens startpaketskanning.
Du kan hitta lite grundläggande information i vårens startdokument i följande länk ( använder-boot-strukturering-din-kod ) men jag kommer att försöka ge mer detaljerad information.
Vårstart, och våren i allmänhet, ger en funktion för att automatiskt skanna paket för vissa kommentarer för att skapa beans
och configuration
.
parametrar
Anteckning | detaljer |
---|---|
@SpringBootApplication | Huvudsakliga vårstartansökanotering. används en gång i applikationen, innehåller en huvudmetod och fungerar som huvudpaket för paketskanning |
@SpringBootConfiguration | Indikerar att en klass tillhandahåller Spring Boot-applikation. Bör deklareras endast en gång i applikationen, vanligtvis automatiskt genom att ställa in @SpringBootApplication |
@EnableAutoConfiguration | Aktivera autokonfiguration av Spring Application Context. Bör deklareras endast en gång i applikationen, vanligtvis automatiskt genom att ställa in @SpringBootApplication |
@ComponentScan | Används för att utlösa automatisk paketskanning på ett visst paket och dess barn eller för att ställa in anpassad paketskanning |
@Konfiguration | Används för att förklara en eller flera @Bean metoder. Kan väljas med automatisk paketskanning för att deklarera en eller flera @Bean metoder istället för traditionell xml-konfiguration |
@Böna | Indikerar att en metod producerar en böna som ska hanteras av vårbehållaren. Vanligtvis kommer @Bean kommenterade metoder att placeras i @Configuration kommenterade klasser som kommer att väljas genom paketskanning för att skapa java-konfigurationsbaserade bönor. |
@Komponent | Genom att deklarera en klass som @Component blir det kandidater för automatisk upptäckt när man använder annotationsbaserad konfiguration och klassvägsskanning. Vanligtvis blir en klass som är kommenterad med @Component en bean i applikationen |
@Repository | Ursprungligen definierades av Domain-Driven Design (Evans, 2003) som "en mekanism för kapsling av lagring. Det används vanligtvis för att indikera ett Repository för spring data |
@Service | Mycket lika i praktiken med @Component . ursprungligen definierades av Domain-Driven Design (Evans, 2003) som "en operation som erbjuds som ett gränssnitt som står ensam i modellen, utan inkapslat tillstånd." |
@Kontrollant | Indikerar att en kommenterad klass är en "Controller" (t.ex. en webbkontroller). |
@RestController | En bekvämhetsanteckning som i sig själv är kommenterad med @Controller och @ResponseBody . Väljs automatiskt som standard eftersom den innehåller @Controller kommentaren som @Controller som standard. |
@SpringBootApplication
Det mest grundläggande sättet att strukturera din kod med vårstart för bra automatisk paketskanning är att använda @SpringBootApplication
kommentarer. Den här anteckningen ger i sig 3 andra kommentarer som hjälper till med automatisk skanning: @SpringBootConfiguration
, @EnableAutoConfiguration
, @ComponentScan
(mer information om varje annotation i avsnittet Parameters
).
@SpringBootApplication
kommer vanligtvis att placeras i huvudpaketet och alla andra komponenter kommer att placeras i paket under denna fil:
com
+- example
+- myproject
+- Application.java (annotated with @SpringBootApplication)
|
+- domain
| +- Customer.java
| +- CustomerRepository.java
|
+- service
| +- CustomerService.java
|
+- web
+- CustomerController.java
Såvida inget annat anges, upptäcker @Configuration
@Component
, @Configuration
, @Component
, @Repository
, @Service
, @Controller
@RestController
kommentarer automatiskt under de skannade paketen ( @Configuration
och @RestController
eftersom de kommenteras av @Component
och @Controller
enlighet därmed ).
Exempel på grundläggande kod:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Ställer in paket / klasser uttryckligen
Sedan version 1.3 kan du också säga vårstart att skanna specifika paket genom att ställa scanBasePackages
eller scanBasePackageClasses
i @SpringBootApplication
istället för att ange @ComponentScan
.
-
@SpringBootApplication(scanBasePackages = "com.example.myproject")
- ställcom.example.myproject
som baspaketet som ska skannas. -
@SpringBootApplication(scanBasePackageClasses = CustomerController.class)
- typsäkert alternativ tillscanBasePackages
anger paketet medCustomerController.java
,com.example.myproject.web
, som baspaketet som ska skannas.
Exklusive autokonfiguration
En annan viktig funktion är möjligheten att utesluta specifika autokonfigureringsklasser med hjälp av exclude
eller exclude
excludeName
( excludeName
finns sedan version 1.3 ).
-
@SpringBootApplication(exclude = DemoConfiguration.class)
- kommer att uteslutaDemoConfiguration
frånDemoConfiguration
. -
@SpringBootApplication(excludeName = "DemoConfiguration")
- kommer att göra samma sak med klassificerat helt klassificerat namn.
@ComponentScan
Du kan använda @ComponentScan
för att konfigurera mer komplex paketskanning. Det finns också @ComponentScans
som fungerar som en containernotation som @ComponentScan
flera @ComponentScan
kommentarer.
Grundläggande kodexempel
@ComponentScan
public class DemoAutoConfiguration {
}
@ComponentScans({@ComponentScan("com.example1"), @ComponentScan("com.example2")})
public class DemoAutoConfiguration {
}
Att ange @ComponentScan
utan konfiguration fungerar som @SpringBootApplication
och skannar alla paket under klassen som kommenteras med den här kommentaren.
I det här exemplet kommer jag att ange några av de användbara attributen hos @ComponentScan
:
- basePackages - kan användas för att ange specifika paket att skanna.
- useDefaultFilters - genom att ställa in detta attribut till falskt (standardinställningar sant) kan du se till att våren inte skannar
@Component
,@Repository
,@Service
eller@Controller
automatiskt. - includeFilters - kan användas för att inkludera specifika våranteckningar / regex-mönster som ska inkluderas i paketskanning.
- excludeFilters - kan användas för att utesluta specifika våranteckningar / regex-mönster som ska inkluderas i paketskanning.
Det finns många fler attribut men de är de vanligaste för att anpassa paketskanning.
Skapa din egen autokonfiguration
Spring boot är baserat på en hel del förberedda autokonfigurering av överordnade projekt. Du bör redan vara bekant med vårstartstartprojekt.
Du kan enkelt skapa ditt eget startprojekt genom att göra följande enkla steg:
- Skapa några
@Configuration
klasser för att definiera standardbönor. Du bör använda externa egenskaper så mycket som möjligt för att tillåta anpassning och försöka använda@AutoConfigureBefore
som@AutoConfigureBefore
,@AutoConfigureAfter
,@ConditionalOnBean
,@ConditionalOnMissingBean
etc. Du kan hitta mer detaljerad information om varje kommentar i den officiella dokumentationen Villkoranteckningar - Placera en autokonfigurationsfil / filer som sammanför alla
@Configuration
klasserna. - Skapa en fil med namnet
spring.factories
och placera den isrc/main/resources/META-INF
. - I
spring.factories
ställer du inorg.springframework.boot.autoconfigure.EnableAutoConfiguration
egenskapen med kommaseparerade värden för dina@Configuration
klasser:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.mycorp.libx.autoconfigure.LibXAutoConfiguration,\
com.mycorp.libx.autoconfigure.LibXWebAutoConfiguration
Med den här metoden kan du skapa dina egna autokonfigurationsklasser som kommer att väljas av spring-boot. Spring-boot skannar automatiskt alla beroenden av maven / gradle för en spring.factories
fil, om den hittar en lägger den till alla @Configuration
klasser som anges i den till sin autokonfigurationsprocess.
Se till att din auto-configuration
starter projekt inte innehåller spring boot maven plugin
eftersom det kommer att paketera projektet som en körbar JAR och kommer inte att belastas av klassökvägen som avsett - våren boot kommer inte att kunna hitta dina spring.factories
och laddar inte din konfiguration