Análisis del rango de escaneo y del código fuente de las anotaciones de ComponentScan
El rango de escaneo predeterminado de las anotaciones de ComponentScan es el directorio donde se encuentra el programa de inicio XxxApplication.java y todos los subpaquetes que contiene.
Para una mejor comprensión, echemos un vistazo a la siguiente imagen.
La clase de inicio de este proyecto es SpringbootApplication.java
El directorio donde se encuentra la clase de inicio es: springboot
Luego, el rango de escaneo predeterminado de ComponentScan La anotación es el directorio Springboot y todos sus subpaquetes en .
En segundo lugar, cómo modificar el rango de escaneo de la anotación ComponentScan
La anotación ComponentScan puede escanear tanto paquetes como clases específicas. Solo necesitamos especificar la ruta de escaneo de un paquete para realizar la función de cambiar la ruta de escaneo del paquete.
1. Paquete de escaneo de anotaciones ComponentScan.
@ComponentScan({"com.company.user", "com.company.service"})
2. Clase de escaneo de anotaciones ComponentScan.
@ComponentScan(basePackageClasses={XxxService.class})
3. Anotaciones de ComponentScan
Se definen 12 propiedades en las anotaciones de ComponentScan, que discutiremos en detalle a continuación. Nuestra discusión se basa en java8 y la versión de contexto de primavera es 4.3.7.
1. String[ ] value() default {};
Especifica la ruta para el escaneo del paquete. El atributo de valor del atributo de valor es una ruta específica en el proyecto. El atributo de valor es de tipo Matriz de cadenas El atributo de valor es de tipo Matriz de cadenas, lo que significa que admite la especificación de múltiples rutas de escaneo de paquetes al mismo tiempo. Esta propiedad tiene una anotación @AliasFor("basePackages"), lo que significa que la propiedad de valor es equivalente a la propiedad basePackages. A continuación se proporciona más información sobre la propiedad basePackages.
2, String[] basePackages() default {};
Especifica la ruta de escaneo del paquete de software, es decir, el valor del atributo basePackages es una ruta específica en el proyecto. La anotación @AliasFor("valor") se ha agregado a la propiedad basePackages, lo que significa que la propiedad basePackages es equivalente a la propiedad value.
3. Clase >[] basePackagesClasses() default {};
Escanea clases específicas. El tipo de propiedad basePackagesClasses es una matriz de clases, lo que significa que se pueden especificar varias clases escaneadas al mismo tiempo.
4, Clase extiende BeanNameGenerator> nameGenerator() clase BeanNameGenerator predeterminada;
Configure el generador BeanName, su valor predeterminado es BeanNameGenerator. Normalmente, usamos el BeanNameGenerator predeterminado, pero Spring implementa un BeanNameGenerator configurable.
5, Clase extends ScopeMetaDataResolver>scopeResolver() default AnnotationScopeMetaDataResolver.class;
Maneja el alcance del Bean detectado. ¿qué significa eso? Todos sabemos que Spring Bean tiene un alcance, que es un singleton por defecto. Este valor predeterminado se especifica en la clase ScopeMetaData:
private String ScopeName = "singleton";
Esto. El atributo también es una configuración opcional, la clase de implementación predeterminada para procesar el alcance del Bean es AnnotationScopeMetaDataResolver.class. El código fuente es relativamente simple, solo toma el valor del alcance especificado en la anotación. Si no hay configuración, se usa el singleton predeterminado.
6. ScopedProxyMode ScopedProxy() default ScopedProxyMode.DEFAULT;
Si se genera un proxy para el componente detectado.
ScopedProxyMode es una clase de enumeración con cuatro valores opcionales: DEFAULT, NO, INTERFACES y TARGET_CLASS.
7. String ResourcePattern() tiene como valor predeterminado ""**/*.class"";
Controla los archivos de clase que cumplen con las condiciones de detección de componentes y tiene como valor predeterminado ?**/*.class.< / p>
8. boolean useDefaultFilters() valor predeterminado verdadero;
Ya sea para habilitar la detección de clases que contienen las siguientes anotaciones, el valor predeterminado está habilitado.
@Component
@Repository
@Service
@Controller
9, ComponentScan.Filter[] includeFilters() default {};
Especifica clases analizadas por ciertos filtros. Esto puede parecer un poco tedioso, pero para decirlo claramente, simplemente especifica el tipo y busca el tipo especificado. Se definen cinco tipos opcionales en la clase de enumeración FilterType:
Primero:
Segundo: ASSIGNABLE_TYPE
Tercero: ASPECTJ
Cuarto: REGEX , expresión regular.
Quinto: CUSTOM, tipo personalizado.
10. ComponentScan.Filter[] exclusionFilters() default {};
Excluir clases analizadas por filtros.
11, booleano lazyInit() predeterminado falso;
Si se habilita la carga diferida para las clases escaneadas.
12,
@Retention(RetentionPolicy.RUNTIME);
@Target({})
público @interface Filtro {
FilterType tipo() predeterminado FilterType.ANNOTATION;
@AliasFor("clases")
Clase >[] valor() predeterminado {};
@AliasFor("valor")
Clase >[] clases() predeterminado {};
String[] patrón() predeterminado {};
}