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 .

  1. @SpringBootApplication(scanBasePackages = "com.example.myproject") - stel com.example.myproject als het te scannen basispakket.
  2. @SpringBootApplication(scanBasePackageClasses = CustomerController.class) - type-veilig alternatief voor scanBasePackages stelt het pakket van CustomerController.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 ).

  1. @SpringBootApplication(exclude = DemoConfiguration.class) - sluit DemoConfiguration uit van het automatisch scannen van pakketten.
  2. @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 :

  1. basePackages - kunnen worden gebruikt om specifieke te scannen pakketten aan te geven.
  2. useDefaultFilters - door dit kenmerk in te stellen op false (standaardwaarden true), kunt u ervoor zorgen dat Spring niet automatisch @Component , @Repository , @Service of @Controller .
  3. includeFilters - kan worden gebruikt om specifiek spring annotaties / regex patronen omvatten met pakket scan in te.
  4. 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:

  1. 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
  2. Plaats een automatisch configuratiebestand / bestanden die alle @Configuration klassen @Configuration .
  3. Maak een bestand met de naam spring.factories en plaats dit in src/main/resources/META-INF .
  4. In spring.factories , set org.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



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow