spring-boot
Scansione del pacchetto
Ricerca…
introduzione
In questo argomento vedrò una panoramica della scansione del pacchetto di avvio di primavera.
Puoi trovare alcune informazioni di base nei documenti di avvio di primavera nel seguente link ( using-boot-structuring-your-code ) ma cercherò di fornire informazioni più dettagliate.
Spring boot, e spring in generale, forniscono una funzionalità per scansionare automaticamente i pacchetti per determinate annotazioni al fine di creare beans
e configuration
.
Parametri
Annotazione | Dettagli |
---|---|
@SpringBootApplication | Annotazione dell'applicazione di avvio principale. utilizzato una sola volta nell'applicazione, contiene un metodo principale e funge da pacchetto principale per la scansione del pacchetto |
@SpringBootConfiguration | Indica che una classe fornisce un'applicazione Spring Boot. Dovrebbe essere dichiarato una sola volta nell'applicazione, solitamente automaticamente impostando @SpringBootApplication |
@EnableAutoConfiguration | Abilita la configurazione automatica del contesto dell'applicazione Spring. Dovrebbe essere dichiarato una sola volta nell'applicazione, solitamente automaticamente impostando @SpringBootApplication |
@ComponentScan | Utilizzato per attivare la scansione automatica dei pacchetti su un determinato pacchetto e relativi figli o per impostare la scansione dei pacchetti personalizzati |
@Configurazione | Utilizzato per dichiarare uno o più metodi @Bean . Può essere scelto dalla scansione automatica dei pacchetti per dichiarare uno o più metodi @Bean invece della tradizionale configurazione xml |
@Fagiolo | Indica che un metodo produce un bean che deve essere gestito dal contenitore Spring. Solitamente @Bean metodi annotati saranno posizionati in @Configuration classi annotate che verranno raccolti mediante scansione pacchetto per creare fagioli basati configurazione java. |
@Componente | Dichiarando una classe come @Component diventa un candidato per il rilevamento automatico quando si utilizzano la configurazione basata su annotazione e la scansione del percorso di classe. Di solito una classe annotata con @Component diventerà un bean nell'applicazione |
@Repository | Originariamente definito da Domain-Driven Design (Evans, 2003) come "un meccanismo per l'incapsulamento dello spazio di archiviazione." Solitamente viene usato per indicare un Repository per i spring data |
@Servizio | Molto simile in pratica a @Component . originariamente definito da Domain-Driven Design (Evans, 2003) come "un'operazione offerta come interfaccia che si trova da sola nel modello, senza stato incapsulato". |
@Controller | Indica che una classe annotata è un "Controller" (ad esempio un controller Web). |
@RestController | Un'annotazione di convenienza a sua volta annotata con @Controller e @ResponseBody . Viene selezionato automaticamente per impostazione predefinita poiché contiene l'annotazione @Controller che viene selezionata per impostazione predefinita. |
@SpringBootApplication
Il modo più semplice per strutturare il codice utilizzando l'avvio a molla per una buona scansione automatica dei pacchetti è l'annotazione @SpringBootApplication
. Questa annotazione fornisce di per sé altre 3 annotazioni utili per la scansione automatica: @SpringBootConfiguration
, @EnableAutoConfiguration
, @ComponentScan
(ulteriori informazioni su ciascuna annotazione nella sezione Parameters
).
@SpringBootApplication
verrà @SpringBootApplication
inserito nel pacchetto principale e tutti gli altri componenti verranno inseriti in pacchetti sotto questo file:
com
+- example
+- myproject
+- Application.java (annotated with @SpringBootApplication)
|
+- domain
| +- Customer.java
| +- CustomerRepository.java
|
+- service
| +- CustomerService.java
|
+- web
+- CustomerController.java
Salvo diversa indicazione, spring boot rileva automaticamente le annotazioni @Configuration
, @Component
, @Repository
, @Service
, @Controller
, @RestController
sotto i pacchetti scansionati ( @Configuration
e @RestController
vengono selezionati perché sono annotati da @Component
e @Controller
conseguenza ).
Esempio di codice di base:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Impostazione di pacchetti / classi in modo esplicito
Dalla versione 1.3 è anche possibile indicare all'avvio di primavera di analizzare pacchetti specifici impostando scanBasePackages
o scanBasePackageClasses
in @SpringBootApplication
invece di specificare @ComponentScan
.
-
@SpringBootApplication(scanBasePackages = "com.example.myproject")
- impostacom.example.myproject
come pacchetto base da analizzare. -
@SpringBootApplication(scanBasePackageClasses = CustomerController.class)
- type-safe alternativa ascanBasePackages
imposta il pacchetto diCustomerController.java
,com.example.myproject.web
, come pacchetto base da analizzare.
Esclusa la configurazione automatica
Un'altra caratteristica importante è la possibilità di escludere classi di configurazione automatica specifiche utilizzando exclude
o excludeName
( excludeName
esiste dalla versione 1.3 ).
-
@SpringBootApplication(exclude = DemoConfiguration.class)
- escludeDemoConfiguration
dalla scansione automatica dei pacchetti. -
@SpringBootApplication(excludeName = "DemoConfiguration")
- farà lo stesso usando il nome completamente classificato della classe.
@ComponentScan
È possibile utilizzare @ComponentScan
per configurare una scansione dei pacchetti più complessa. C'è anche @ComponentScans
che agisce come un'annotazione del contenitore che aggrega diverse annotazioni @ComponentScan
.
Esempi di codice di base
@ComponentScan
public class DemoAutoConfiguration {
}
@ComponentScans({@ComponentScan("com.example1"), @ComponentScan("com.example2")})
public class DemoAutoConfiguration {
}
Dichiarando @ComponentScan
senza alcuna configurazione si comporta come @SpringBootApplication
e analizza tutti i pacchetti sotto la classe annotati con questa annotazione.
In questo esempio specificherò alcuni degli attributi utili di @ComponentScan
:
- basePackages : può essere utilizzato per indicare pacchetti specifici da analizzare.
- useDefaultFilters - impostando questo attributo su false (default true) puoi assicurarti che spring non
@Controller
automaticamente la scansione di@Component
,@Repository
,@Service
o@Controller
. - includeFilters - può essere usato per includere specifiche annotazioni a molla / modelli regex da includere nella scansione del pacchetto.
- excludeFilters - può essere usato per escludere specifiche annotazioni primaverili / regex da includere nella scansione del pacchetto.
Esistono molti altri attributi, ma quelli più comunemente usati per personalizzare la scansione dei pacchetti.
Creazione della propria configurazione automatica
L'avvio a molla si basa su molti progetti principali di autoconfigurazione automatica. Dovresti già avere familiarità con i progetti di avvio di avvio a molla.
Puoi facilmente creare il tuo progetto di avviamento seguendo i seguenti semplici passaggi:
- Creare alcune classi
@Configuration
per definire i bean predefiniti. Si consiglia di utilizzare le proprietà esterne, per quanto possibile per consentire la personalizzazione e provare a utilizzare le annotazioni helper di configurazione automatica come@AutoConfigureBefore
,@AutoConfigureAfter
,@ConditionalOnBean
,@ConditionalOnMissingBean
ecc È possibile trovare informazioni più dettagliate su ogni annotazione nella Gazzetta documentazione annotazioni Stato - Inserire un file / file di configurazione automatica che aggrega tutte le classi
@Configuration
. - Creare un file denominato
spring.factories
e posizionarlo insrc/main/resources/META-INF
. - In
spring.factories
, impostare la proprietàorg.springframework.boot.autoconfigure.EnableAutoConfiguration
con valori separati da virgole delle classi@Configuration
:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.mycorp.libx.autoconfigure.LibXAutoConfiguration,\
com.mycorp.libx.autoconfigure.LibXWebAutoConfiguration
Usando questo metodo puoi creare le tue classi di configurazione automatica che verranno selezionate da spring-boot. Spring-boot scansiona automaticamente tutte le dipendenze maven / gradle per un file spring.factories
, se ne trova uno, aggiunge tutte @Configuration
classi @Configuration
specificate in esso al suo processo di auto-configurazione.
Assicurati che il tuo progetto di avvio con auto-configuration
non contenga spring boot maven plugin
perché impacchetterà il progetto come un JAR eseguibile e non verrà caricato dal classpath come previsto - l'avvio a molla non sarà in grado di trovare i tuoi spring.factories
e non caricherà la tua configurazione