spring-boot
Pakket scannen
Zoeken…
Invoering
In dit onderwerp zal ik een overzicht geven van het scannen van spring boot pakketten.
U kunt basisinformatie vinden in de lente-opstartdocumenten op de volgende link ( met behulp van-boot-structuring-uw-code ), maar ik zal proberen meer gedetailleerde informatie te verstrekken.
Spring boot, en lente in het algemeen, bieden een functie om pakketten automatisch te scannen op bepaalde annotaties om beans
en configuration
.
parameters
aantekening | Details |
---|---|
@SpringBootApplication | Hoofdaantekening annotatie van de veerboot. één keer gebruikt in de applicatie, bevat een hoofdmethode en fungeert als hoofdpakket voor het scannen van pakketten |
@SpringBootConfiguration | Geeft aan dat een klasse een Spring Boot-toepassing biedt. Mag slechts eenmaal in de toepassing worden aangegeven, meestal automatisch door @SpringBootApplication |
@EnableAutoConfiguration | Schakel de automatische configuratie van de Spring Application Context in. Mag slechts eenmaal in de toepassing worden aangegeven, meestal automatisch door @SpringBootApplication |
@ComponentScan | Wordt gebruikt om het automatisch scannen van pakketten op een bepaald pakket en de bijbehorende kinderen te activeren of om aangepaste scanscans in te stellen |
@Configuratie | Wordt gebruikt om een of meer @Bean methoden te declareren. Kan worden gekozen door automatisch pakket scannen om een of meer @Bean methoden te declareren in plaats van de traditionele XML-configuratie |
@Boon | Geeft aan dat een methode een boon produceert die moet worden beheerd door de Spring-container. Gewoonlijk worden @Bean geannoteerde methoden geplaatst in geannoteerde @Configuration klassen die worden geselecteerd door @Configuration om bonen op basis van Java-configuratie te maken. |
@Component | Door een klasse als een @Component , wordt deze een kandidaat voor automatische detectie bij gebruik van op annotatie gebaseerde configuratie en klassepadscannen. Gewoonlijk wordt een klasse geannoteerd met @Component een bean in de toepassing |
@Repository | Oorspronkelijk gedefinieerd door Domain-Driven Design (Evans, 2003) als "een mechanisme voor het inkapselen van de opslag. Het wordt veelal gebruikt om aan te geven Repository voor spring data |
@Onderhoud | Zeer vergelijkbaar in de praktijk met @Component . oorspronkelijk gedefinieerd door Domain-Driven Design (Evans, 2003) als "een bewerking aangeboden als een interface die op zichzelf staat in het model, zonder ingekapselde status". |
@Controller | Geeft aan dat een geannoteerde klasse een "controller" is (bijvoorbeeld een webcontroller). |
@RestController | Een handige annotatie die zelf is geannoteerd met @Controller en @ResponseBody . Wordt standaard automatisch gekozen omdat deze de annotatie van @Controller bevat die standaard wordt gekozen. |
@SpringBootApplication
De meest eenvoudige manier om uw code te structureren met behulp van spring boot voor goed automatisch scannen van pakketten, is het gebruik van @SpringBootApplication
annotatie. Deze annotatie biedt op zichzelf 3 andere annotaties die helpen bij automatisch scannen: @SpringBootConfiguration
, @EnableAutoConfiguration
, @ComponentScan
(meer informatie over elke annotatie in het gedeelte Parameters
).
@SpringBootApplication
wordt meestal in het @SpringBootApplication
geplaatst en alle andere componenten worden in pakketten onder dit bestand geplaatst:
com
+- example
+- myproject
+- Application.java (annotated with @SpringBootApplication)
|
+- domain
| +- Customer.java
| +- CustomerRepository.java
|
+- service
| +- CustomerService.java
|
+- web
+- CustomerController.java
Tenzij anders vermeld, detecteert spring boot automatisch @Configuration
, @Component
, @Repository
, @Service
, @Controller
, @RestController
annotaties onder de gescande pakketten ( @Configuration
en @RestController
worden geplukt omdat ze overeenkomstig worden geannoteerd door @Component
en @Controller
).
Voorbeeld basiscode:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Pakketten / klassen expliciet instellen
Sinds versie 1.3 kunt u Spring Boot ook vertellen om specifieke pakketten te scannen door scanBasePackages
of scanBasePackageClasses
in @SpringBootApplication
in te scanBasePackageClasses
in plaats van @ComponentScan
.
-
@SpringBootApplication(scanBasePackages = "com.example.myproject")
- stelcom.example.myproject
als het te scannen basispakket. -
@SpringBootApplication(scanBasePackageClasses = CustomerController.class)
- type-veilig alternatief voorscanBasePackages
stelt het pakket vanCustomerController.java
,com.example.myproject.web
, in als het te scannen basispakket.
Exclusief automatische configuratie
Een ander belangrijk kenmerk is de mogelijkheid om specifieke automatische configuratieklassen uit te exclude
met behulp van exclude
of excludeName
( excludeName
bestaat sinds versie 1.3 ).
-
@SpringBootApplication(exclude = DemoConfiguration.class)
- sluitDemoConfiguration
uit van het automatisch scannen van pakketten. -
@SpringBootApplication(excludeName = "DemoConfiguration")
- doet hetzelfde met de volledig geclassificeerde naam van de klasse.
@ComponentScan
U kunt @ComponentScan
gebruiken om complexere @ComponentScan
te configureren. Er zijn ook @ComponentScans
die fungeren als containerannotatie die verschillende @ComponentScan
annotaties verzamelt.
Voorbeelden van basiscodes
@ComponentScan
public class DemoAutoConfiguration {
}
@ComponentScans({@ComponentScan("com.example1"), @ComponentScan("com.example2")})
public class DemoAutoConfiguration {
}
Het vermelden van @ComponentScan
zonder configuratie werkt als @SpringBootApplication
en scant alle pakketten onder de klasse die met deze annotatie zijn geannoteerd.
In dit voorbeeld zal ik enkele nuttige attributen van @ComponentScan
:
- basePackages - kunnen worden gebruikt om specifieke te scannen pakketten aan te geven.
- useDefaultFilters - door dit kenmerk in te stellen op false (standaardwaarden true), kunt u ervoor zorgen dat Spring niet automatisch
@Component
,@Repository
,@Service
of@Controller
. - includeFilters - kan worden gebruikt om specifiek spring annotaties / regex patronen omvatten met pakket scan in te.
- excludeFilters - kan worden gebruikt om specifieke veerannotaties / regexpatronen uit te sluiten die bij het scannen van pakketten moeten worden opgenomen.
Er zijn nog veel meer attributen, maar die worden het meest gebruikt om het scannen van pakketten aan te passen.
Uw eigen automatische configuratie maken
Spring boot is gebaseerd op veel vooraf gemaakte automatische configuratie-ouderprojecten. Je zou al bekend moeten zijn met springboot starter-projecten.
U kunt eenvoudig uw eigen startersproject maken door de volgende eenvoudige stappen te volgen:
- Maak enkele
@Configuration
klassen om standaardbonen te definiëren. U moet zoveel mogelijk externe eigenschappen gebruiken om aanpassing toe te staan en proberen automatische configuratie-@AutoConfigureBefore
zoals@AutoConfigureBefore
,@AutoConfigureAfter
,@ConditionalOnBean
,@ConditionalOnMissingBean
enz.@ConditionalOnMissingBean
. U kunt meer gedetailleerde informatie over elke annotatie vinden in de officiële documentatie Staat annotaties - Plaats een automatisch configuratiebestand / bestanden die alle
@Configuration
klassen@Configuration
. - Maak een bestand met de naam
spring.factories
en plaats dit insrc/main/resources/META-INF
. - In
spring.factories
, setorg.springframework.boot.autoconfigure.EnableAutoConfiguration
pand met door komma's gescheiden waarden van uw@Configuration
klassen:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.mycorp.libx.autoconfigure.LibXAutoConfiguration,\
com.mycorp.libx.autoconfigure.LibXWebAutoConfiguration
Met deze methode kunt u uw eigen automatische configuratieklassen maken die worden geselecteerd door spring-boot. Spring-boot scant automatisch alle maven / gradle-afhankelijkheden voor een spring.factories
bestand, als het er een vindt, voegt het alle @Configuration
opgegeven @Configuration
klassen toe aan het automatische configuratieproces.
Zorg ervoor dat je auto-configuration
starterproject geen spring boot maven plugin
omdat het het project als een uitvoerbare JAR zal verpakken en niet door het classpath zal worden geladen zoals bedoeld - spring boot kan je spring.factories
en laadt uw configuratie niet