Proceso de creación de proxy @Async
La función de la anotación anterior es registrar un bean que implementa la interfaz BeanPostProcessor y puede participar en la inicialización del bean.
Esta anotación define algunas propiedades e "importa" un AsyncConfigurationSelector.
Esta clase registrará ProxyAsyncConfiguration.
En otras palabras, se ha registrado el AsyncAnnotationBeanPostProcessor, completando así el proxy Bean.
AsyncAnnotationBeanPostProcessor solo implementa el método setBeanFactory. En este método, se define el potenciador AsyncAnnotationAdvisor.
La implementación del proxy se basa en los métodos definidos por BeanPostProcessor implementado por AbstractAdvisingBeanPostProcessor.
En la situación anterior, cuando varios proxies automáticos representan el mismo bean, puede ocurrir el problema de proxy secundario del bean. Por supuesto, AbstractAdvisingBeanPostProcessor tiene esto en cuenta explícitamente.
Del análisis de nombres de Spring: AbstractAdvisingBeanPostProcessor.
La transacción se basa en el procesador de proxy automático abstracto AbstractAutoProxyCreator.
Por supuesto, usamos @Async en AsyncAnnotationBeanPostProcessor para completar el procesamiento. Del análisis en 2, podemos ver que la subclase anula el método isEligible / prepareProxyFactory / setBeanFactory. Continúe analizando los métodos reescritos por subclases.
Spring proporciona un método de herramienta, el método AopUtils.canApply(). Por supuesto, este método también se puede utilizar fuera del contenedor Spring:
Extrae partes clave del código fuente y. centrarse en el análisis Cómo Spring verifica si un bean se puede mejorar con @Async.
Inicie el proyecto y vea si los beans se pueden mejorar.
Verifique si la anotación @Async existe en el método o clase.
Ubicación de origen: org.springframework.aop.support.MethodMatchers.UnionMethodMatcher
Utilice org.springframework.aop.support.annotation.AnnotationClassFilter#matches para verificar si @Async existe en el anotación de clase?
checkInherited significa verificar si existen anotaciones en la clase principal. El valor predeterminado es verdadero
Fuente: org.springframework.aop.support.annotation.AnnotationMethodMatcher#matched
AbstractAdvisingBeanPostProcessor es un BeanPostProcessor mejorado que define asesores dentro del procesador.
El asesor se define en el método org.springframework.scheduling.annotation.AsyncAnnotationBeanPostProcessor#setBeanFactory.
Fuente: org. Springframework.aop.framework.autoproxy.AbstractBeanFactoryAwareAdvisingPostProcessor
Configura ProxyFactory para generar objetos proxy Proxy.
Este objeto es un AsyncAnnotationBeanPostProcessor porque implementa la interfaz ProxyConfig (clase de configuración de proxy). Puede afectar la creación de ProxyFactory.
Por supuesto, los desarrolladores pueden modificar BeanDefinition de AsyncAnnotationBeanPostProcessor para definir objetos proxy.