spring-boot
Escaneo de paquetes
Buscar..
Introducción
En este tema, haré una visión general de la exploración del paquete de arranque de primavera.
Puede encontrar información básica en Spring Boots en el siguiente enlace ( using-boot-structuring-your-code ) pero intentaré proporcionar información más detallada.
Spring boot, y spring en general, proporcionan una función para escanear automáticamente paquetes para ciertas anotaciones con el fin de crear beans
y configuration
.
Parámetros
Anotación | Detalles |
---|---|
@SpringBootApplication | Anotación principal de la aplicación de arranque de muelle. se utiliza una vez en la aplicación, contiene un método principal y actúa como paquete principal para el escaneo de paquetes |
@SpringBootConfiguration | Indica que una clase proporciona la aplicación Spring Boot. Debe declararse solo una vez en la aplicación, generalmente de forma automática mediante la configuración de @SpringBootApplication |
@EnableAutoConfiguration | Habilitar la configuración automática del contexto de la aplicación Spring. Debe declararse solo una vez en la aplicación, generalmente de forma automática mediante la configuración de @SpringBootApplication |
@ComponentScan | Se utiliza para activar el escaneo automático de paquetes en un paquete determinado y sus hijos o para configurar el escaneo de paquetes personalizados |
@Configuración | Se utiliza para declarar uno o más métodos @Bean . Puede seleccionarse mediante el escaneo automático de paquetes para declarar uno o más métodos @Bean lugar de la configuración xml tradicional |
@Frijol | Indica que un método produce un bean para ser administrado por el contenedor Spring. Por @Bean general, los métodos anotados de @Bean se colocarán en las clases anotadas de @Configuration que se seleccionarán mediante el escaneo del paquete para crear beans basados en la configuración de Java. |
@Componente | Al declarar una clase como @Component se convierte en un candidato para la detección automática cuando se utiliza la configuración basada en anotaciones y el escaneo de classpath. Por lo general, una clase anotada con @Component se convertirá en un bean en la aplicación |
@Repositorio | Definido originalmente por Domain-Driven Design (Evans, 2003) como "un mecanismo para encapsular el almacenamiento. Normalmente se usa para indicar un Repository para spring data |
@Servicio | Muy similar en la práctica a @Component . originalmente definido por Domain-Driven Design (Evans, 2003) como "una operación ofrecida como una interfaz que se mantiene aislada en el modelo, sin estado encapsulado". |
@Controlador | Indica que una clase anotada es un "Controlador" (por ejemplo, un controlador web). |
@RestController | Una anotación de conveniencia que se anota con @Controller y @ResponseBody . Se seleccionará automáticamente de forma predeterminada porque contiene la anotación @Controller que se selecciona de forma predeterminada. |
@SpringBootApplication
La forma más básica de estructurar su código utilizando Spring Boot para un buen escaneo automático de paquetes es mediante la anotación @SpringBootApplication
. Esta anotación proporciona en sí misma otras 3 anotaciones que ayudan con el escaneo automático: @SpringBootConfiguration
, @EnableAutoConfiguration
, @ComponentScan
(más información sobre cada anotación en la sección Parameters
).
@SpringBootApplication
lo @SpringBootApplication
, @SpringBootApplication
se colocará en el paquete principal y todos los demás componentes se colocarán en paquetes bajo este archivo:
com
+- example
+- myproject
+- Application.java (annotated with @SpringBootApplication)
|
+- domain
| +- Customer.java
| +- CustomerRepository.java
|
+- service
| +- CustomerService.java
|
+- web
+- CustomerController.java
A menos que se indique lo contrario, Spring Boot detecta las @Configuration
, @Component
, @Repository
, @Service
, @Controller
, @RestController
automáticamente en los paquetes escaneados ( @Configuration
y @RestController
se seleccionan porque están anotadas por @Component
y @Controller
consecuencia ).
Ejemplo de código básico:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Configurando paquetes / clases explícitamente
Desde la versión 1.3 también puede decirle a Spring Boot que scanBasePackages
paquetes específicos configurando scanBasePackages
o scanBasePackageClasses
en @SpringBootApplication
en lugar de especificar @ComponentScan
.
-
@SpringBootApplication(scanBasePackages = "com.example.myproject")
: establececom.example.myproject
como el paquete base para escanear. -
@SpringBootApplication(scanBasePackageClasses = CustomerController.class)
: una alternativa segura para elscanBasePackages
ascanBasePackages
establece el paquete deCustomerController.java
,com.example.myproject.web
, como el paquete base para escanear.
Excluyendo la autoconfiguración
Otra característica importante es la capacidad de excluir clases específicas de configuración automática utilizando exclude
o excludeName
(existe excludeName
desde la versión 1.3 ).
-
@SpringBootApplication(exclude = DemoConfiguration.class)
: excluiráDemoConfiguration
de la exploración automática de paquetes. -
@SpringBootApplication(excludeName = "DemoConfiguration")
- hará lo mismo usando el nombre completamente clasificado de la clase.
@ComponentScan
Puede usar @ComponentScan
para configurar un análisis de paquetes más complejo. También hay @ComponentScans
que actúan como una anotación de contenedor que agrega varias anotaciones de @ComponentScan
.
Ejemplos de código básico
@ComponentScan
public class DemoAutoConfiguration {
}
@ComponentScans({@ComponentScan("com.example1"), @ComponentScan("com.example2")})
public class DemoAutoConfiguration {
}
La indicación de @ComponentScan
sin configuración actúa como @SpringBootApplication
y analiza todos los paquetes de la clase anotada con esta anotación.
En este ejemplo, @ComponentScan
algunos de los atributos útiles de @ComponentScan
:
- Los paquetes base se pueden usar para indicar paquetes específicos para escanear.
- useDefaultFilters : al establecer este atributo en falso (el valor predeterminado es verdadero), puede asegurarse de que Spring no escanee
@Component
,@Repository
,@Service
o@Controller
automáticamente. - includeFilters : se puede usar para incluir anotaciones de primavera / patrones de expresiones regulares para incluir en el escaneo de paquetes.
- excludeFilters : se pueden usar para excluir anotaciones específicas de primavera / patrones de expresiones regulares para incluir en el escaneo de paquetes.
Hay muchos más atributos, pero esos son los más utilizados para personalizar el escaneo de paquetes.
Creando tu propia autoconfiguración.
Spring Boot se basa en muchos proyectos primarios de autoconfiguración prefabricados. Ya debe estar familiarizado con los proyectos de arranque de arranque de primavera.
Puede crear fácilmente su propio proyecto de inicio siguiendo estos sencillos pasos:
- Cree algunas clases de
@Configuration
para definir beans predeterminados. Debe utilizar propiedades externas tanto como sea posible para permitir la personalización y tratar de utilizar las anotaciones del ayudante de configuración automática como@AutoConfigureBefore
,@AutoConfigureAfter
,@ConditionalOnBean
,@ConditionalOnMissingBean
etc. Se puede encontrar información más detallada sobre cada anotación en los oficiales documentación anotaciones Estado - Coloque un archivo / archivos de configuración automática que agregue todas las clases de
@Configuration
. - Cree un archivo llamado
spring.factories
y colóquelo ensrc/main/resources/META-INF
. - En
spring.factories
, establezca la propiedadorg.springframework.boot.autoconfigure.EnableAutoConfiguration
con valores separados por comas de sus clases de@Configuration
:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.mycorp.libx.autoconfigure.LibXAutoConfiguration,\
com.mycorp.libx.autoconfigure.LibXWebAutoConfiguration
Usando este método, puede crear sus propias clases de configuración automática que serán seleccionadas por spring-boot. Spring-boot escanea automáticamente todas las dependencias de maven / gradle en busca de un archivo spring.factories
, si encuentra uno, agrega todas @Configuration
clases de @Configuration
especificadas en él a su proceso de configuración automática.
Asegúrese de que su proyecto de inicio de auto-configuration
no contenga spring boot maven plugin
ya que empaquetará el proyecto como un JAR ejecutable y no será cargado por el classpath como se spring.factories
no cargará tu configuración