La forma elegante de registrar los frijoles en primavera
Este artículo primero explicará el uso y el siguiente artículo analizará cómo registrar el Bean en el contenedor IOC en los siguientes escenarios.
Este uso es muy común en proyectos y es básicamente imprescindible. Echemos un vistazo al uso:
Dicho Bean se registra en el contenedor IOC. El nombre del Bean es el nombre del método de forma predeterminada, y el caso no se convertirá, es decir, si su método. El nombre del Bean es TestBean(), entonces el nombre del Bean es TestBean. Por supuesto, también podemos usar nombre o valor para especificar el nombre del Bean, como @Bean (valor = "testBean"). Si ambos existen al mismo tiempo, se informará un error.
Veamos otras propiedades:
autowireCandidate: El valor predeterminado es verdadero. Si se establece en falso, se informará un error al obtener el Bean a través de byType. Por supuesto, podemos usar la anotación de Recursos para obtenerlo.
initMethod: el método de inicialización llamado después de crear una instancia del Bean. El valor es el nombre del método en la clase Bean.
destroyMethod: el método de limpieza que se llama cuando se va a destruir el Bean. El valor es el nombre del método en la clase Bean.
¿Las anotaciones @Bean solo se pueden definir bajo la clase @Configuration? NO NO NO, se puede definir bajo cualquier anotación que el COI pueda escanear, como la anotación @Component. En cuanto a la diferencia, hablaremos de ella en el próximo artículo.
Hablemos primero del uso común:
Uso en profundidad:
Hay dos atributos de este tipo en la anotación ComponentScan: includeFilters y exclusionFilters. Solo contiene reglas. Esta última es una regla de exclusión y su valor tiene la forma de una anotación @Filter. El tipo en Filter tiene 5 tipos, como se muestra a continuación.
1. ANOTACIÓN
La primera es incluirla o no en forma de anotaciones, por ejemplo:
Aquí debes configurar useDefaultFilters = false para deshabilitar las reglas predeterminadas Debido a que la regla predeterminada es escanear todo, es inútil configurar solo incluir. Lo que esto significa es que solo se escanean las anotaciones de configuración.
2. ASSIGNABLE_TYPE
Este tipo contiene el tipo que hemos proporcionado Independientemente del tipo y subclase dados, se incluirá en el contenedor IOC.
Luego descubrimos que testBean estaba registrado. ¿Por qué no marcamos @Component y dichas instancias de anotaciones también se registrarán en el COI? Debido a que ComponentScan escaneará todos los archivos del paquete, siempre que cumpla con las reglas de filtrado que definimos, registrará el bean en el contenedor IOC.
3. ASPECTJ
ASPECTJ usa expresiones de aspectoj
4. REGEX
REGEX usa expresiones regulares
5 . CUSTOM
Este es el método utilizado por nuestra anotación SpringBootApplication. Permítame explicarle las reglas específicas: este método le permite personalizar las reglas de escaneo usted mismo. Acepta una interfaz que implementa la clase TypeFilter.
Cuando escaneó la clase, escaneó el TestBean y luego cumplió con mis reglas de coincidencia (es decir, devolvió verdadero) y se registró.
En el siguiente ejemplo, observamos directamente la implementación del código fuente de Spring, que es más representativo.
Hicimos clic en la anotación @EnableTransactionManagement y encontramos este @Import(TransactionManagementConfigurationSelector.class). Su función es importar la clase, y la clase se registrará en el contenedor IOC.
Si esta anotación se coloca en un lugar que Spring pueda escanear, de lo contrario Spring no analizará activamente esta anotación.
Si queremos utilizar anotaciones nosotros mismos, podemos crear una clase de configuración de importación funcional conectable similar a EnableTransactionManagement, de modo que podamos abrir dinámicamente algunos beans.
Echemos un vistazo a la clase TransactionManagementConfigurationSelector. Al observar su relación de herencia, encontramos que implementa indirectamente la interfaz ImportSelector, principalmente observando el método que implementa:
Este método. La función es crear un Bean basado en el nombre completo de la matriz de clase (org.springframework.context.annotation.AutoProxyRegistrar) que devuelve.
Las clases que implementan ImportSelector también deben importarse usando @Import.
Echemos un vistazo al MapperScannerRegistrar importado por @MapperScan (org.mybatis.spring.annotation) y descubramos que implementa ImportBeanDefinitionRegistrar:
Su función es obtener la información de definición de el BeanDefinitionRegistry Bean y luego agregarle BeanDefinition registrará el objeto correspondiente. No entraré en más detalles. En realidad, analiza los atributos de anotación y luego escanea las clases en el paquete correspondiente para registrar los beans. Hagamos uno simple nosotros mismos.
De esta forma se registra un Bean cuyo nombre es testBean y cuyo tipo es TestBean.
¿Qué pasa si se registra un constructor parametrizado? Eso es todo:
addConstructorArgValue se agrega según el orden de los parámetros del constructor.
Las clases que implementan ImportBeanDefinitionRegistrar también deben importarse usando @Import.
Luego se registra TestBean. Al imprimir, encontramos que el nombre del Bean es el nombre completo de MyFactoryBean, pero su tipo es del tipo TestBean si desea obtener el Bean de MyFactoryBean. escriba, pase el Bean. El nombre es amp;myFactoryBean y se puede obtener.
En nuestro proyecto Spring Boot, generalmente solo escaneamos todas las clases bajo la clase principal y luego cargamos algunas clases marcadas con anotaciones específicas en el contenedor IOC. Sin embargo, si separamos el paquete, cómo cargar. ¿Las clases de otros paquetes son más convenientes? Spring Boot proporciona un mecanismo SPI (descubrimiento de servicios) similar a Java spring.factories. Simplemente cree la carpeta META-INF en el directorio de recursos, luego cree el archivo spring.factories y luego configúrelo dentro
En. De esta manera, cuando se importe el paquete actual, el archivo spring.factories se escaneará automáticamente y algunas clases del mismo se cargarán en el contenedor IOC después del análisis. El código de implementación específico está en la clase SpringFactoriesLoader de spring-core.
No hablaré más de estos.