Análisis en profundidad del mecanismo subyacente de Feign-5.@EnableFeignClients en la serie SpringCloud
Vale la pena leer el código fuente de @EnableFeignClients. Después de leerlo, aprendimos cómo escribir una anotación nosotros mismos y usarlo con éxito.
1. Primero, podemos ingresar a @EnableFeignClients. anotación. Puede ver que se declaran varios atributos en esta anotación. Probablemente pueda ver por el nombre que basePackages debería ser la ruta del paquete y el valor debería ser un alias de basePackages. Dejémoslo de lado por ahora. anotación encima de esta anotación. Haga clic en ella. Echemos un vistazo a las clases.
2. Como se muestra en la figura, puede ver que la clase FeignClientsRegistrar implementa tres clases Spring. Supongo que el primero debería ser sobre el registro de definiciones de clases, y el segundo es sobre el registro de definiciones de clases. El tercero que creo que puede haber usado o comprendido son algunas de las clases Aware de Spring, que son aproximadamente clases para cargar recursos o variables de entorno.
Luego, echemos un vistazo a lo que hay en la clase ImportBeanDefinitionRegistrar:
Puedes ver que hay un método definido en ella, así que volvamos a FeignClientsRegistrar para ver cómo implementa esto. método:
Este método hace principalmente dos cosas. El primer método es el registro. Después de obtener la información de configuración predeterminada, el segundo paso es registrar FeignClients. Veámoslo uno por uno en detalle. >
Cuando se trata del código fuente más detallado, si no puede entenderlo, será mejor que lo interrumpamos. Cuando iniciamos Eureka-server, Eureka-client y luego iniciamos Feign-consumer, el punto de interrupción. puede entrar y podemos ver información de parámetros:
Puede ver los metadatos dentro. Los datos resultan ser las tres anotaciones en la clase de inicio, y también contiene la información de atributos de las tres anotaciones. Echemos un vistazo a la clase principal y compárela para comprenderla:
Luego continuamos estudiando a continuación:
Este paso es más fácil de entender. Anotación EnableFeignClients.
Luego se empalma un nombre. Este nombre es solo un valor predeterminado que se agrega al frente de la clase de inicio. Luego, el registro permanece sin cambios y se pasan los parámetros. El atributo defaultAttrs.get("defaultConfiguration). ") está roto desde hace un momento. Incluso si lo miras, está vacío. Se llama a un método RegisterClientConfiguration:
Este método utiliza BeanDefinitionBuilder de Spring para registrar el bean FeignClientSpecification en el contenedor Spring.
Luego volvemos al método principal y miramos el siguiente método:
Según el nombre RegisterFeignClients, este método debe registrar la clase FeignClients. Ingrese el método, el primer escáner. Echemos un vistazo:
Es un poco difícil de entender, pero está bien, adivinemos, podría ser una herramienta de escaneo.
Continuemos bajando. El escáner carga una clase de ResourceLoader. Podemos verificar que esta clase sea una clase relacionada con recursos en el marco Spring.
Siguiente. , todavía obtenemos la información de atributos de la anotación EnableFeignClients en la clase principal
Más abajo, podemos ver en la figura que la información sobre los clientes se obtiene en los atributos, pero no hay ninguna, y luego El escáner agrega un filtro similar y luego llama al método getBasePackages
Echemos un vistazo al método getBasePackages:
Después de ver el método anterior, este método es fácil de entender. Lo primero es habilitar toda la información de atributos de FeignClients, luego sacar los valores y obtener los valores de atributos de la ruta del paquete, como value o basePackages. Si no se obtiene ninguno, obtenga una ruta de paquete predeterminada. p>
Esto Puede ver que el punto de interrupción de la ruta del paquete es la ruta del paquete de la clase principal, por lo que, en general, la lógica es verificar primero si hay información de la ruta del paquete sobre FeignClient en la anotación. entonces el programa se iniciará desde la ruta del paquete del programa principal. Encuentre todos los FeignClients a continuación.
Echemos un vistazo más de cerca:
Luego continúe mirando el método RegisterClientConfiguration:
Este método que hemos visto antes es cargar una determinada clase en Spring. , Entonces continúe con el siguiente paso y observe el método RegisterFeignClient:
Después de obtener todos los atributos de este FeignClient, realizamos el procesamiento de datos y asignamos toda la información de los atributos a la definición
Este método significa que nosotros La clase usa la inyección de tipo como atributo, y luego
Esta lógica se realiza para evitar problemas con dos FeignClients con la misma clase principal. Todos deberíamos haber encontrado un problema al usar la inyección @Autowire. Al seleccionar la clase, encontré un error que decía que hay dos clases y no sé cuál inyectar. Si una de ellas tiene la anotación @primary, Spring inyectará esta clase primero.
No hay nada más a continuación hasta la ejecución final
Se ha completado toda la implementación de @EnableFeignClients. El código fuente de esta anotación parece relativamente claro y claro, y lo es si lo hacemos. Si necesitamos hacer una nueva anotación, podemos consultarla, que es muy parecida a una plantilla.