Análisis del código fuente del mecanismo de monitoreo de eventos Spring
Evento: para definir tipos de eventos y orígenes de eventos, debe heredar ApplicationEvent.
Escucha de eventos: se utiliza para escuchar ciertos tipos de eventos y ejecutar una lógica de negocio específica. Debe implementar la interfaz ApplicationListener o anotarla con @ListenerEvent(T). Como un observador en modo observador.
Multidifusión de eventos: Responsable de transmitir y notificar a todos los oyentes. Todos los oyentes de eventos están registrados en multidifusión de eventos. Igual que lo que se observa en modo observador. De forma predeterminada, el contenedor Spring genera multidifusión de eventos sincrónicos. Puede personalizar la multidifusión de eventos, que se define como modo asíncrono.
En el proceso de creación de AnnotationConfigApplicationContext, se ejecutará el método initapplicationEventMasterer() en refresco(). Este método primero obtiene la fábrica de beans y luego determina si la fábrica contiene un bean cuyo beanName es applicationEventMulticaster. Si es así, obtenga el bean y asígnelo a la propiedad applicationEventMulticaster. De lo contrario, cree un objeto simpleapplicationEventMulticaster y asígnelo a applicationeventmaster. El código fuente se implementa de la siguiente manera:
Hay dos formas de registrar un oyente: implementando la interfaz ApplicationListener o agregando la anotación @EventListener.
La lógica de registro se implementa en el método RegisterListeners() de refresco(). El primer paso es obtener los oyentes de aplicaciones que se han agregado en el ApplicationContext actual (usado en el código fuente de Spring MVC), recorrerlos en iteración y agregarlos a la multidifusión. El segundo paso es obtener la colección de listeningBeanNames que implementa la interfaz ApplicationListener y agregarla a la multidifusión. El tercer paso es determinar si hay un evento matutino y, de ser así, iniciar una transmisión.
Piénselo, ¿por qué necesita agregar listenerBeanName en el segundo paso del código anterior?
Si el oyente es vago (es decir, hay comentarios @Lazy). Entonces obviamente es incorrecto crear un oyente en este momento. No puede crear oyentes en este momento. Entonces, la lógica específica de agregar un oyente a la multidifusión ocurre después de que se inicializa el oyente específico. A través de la interfaz BeanPostProcessor. La clase de implementación específica es ApplicationListenerDetector. Esta clase se agrega al método prepareBeanFactory() en refreah(). El código es el siguiente:
En el constructor que crea AnnotationConfigApplicationContext, org . spring framework . annotationconfig utils # Registerannotationconfigprocessors(org . spring framework . beans . factory . support . bean definición de registro, ser ejecutado. java.lang.object).
Este método agregará dos beanDefs. El código es el siguiente:
Procesador del método EventListener: el postprocesador BeanFactory del detector de eventos. DefaultEventListenerFactory se creará en la etapa inicial. Se llamará a DefaultEventListenerFactory y se creará un nuevo detector de eventos basado en el atributo del detector de eventos específico.
DefaultEventListenerFactory: una fábrica para crear oyentes, utilizada para crear ApplicationListenerMethodDapter.
El diagrama de herencia de clases de EventListenerMethodProcessor es el siguiente:
El evento org.spring framework.eventlistenermethodprocessor #postprocessbean factory se llamará en invokebeanfactorypostprocessors() para obtener el. Tipo de EventListenerFactory. El código es el siguiente:
En el marco org.spring.fábrica de beans.defaultlistablebeanfactory#método preinstatitesingletons, después de crear todos los beans singleton, analizará si todos los beans implementan la interfaz SmartInitializingSingleton. Si se implementa la interfaz, se ejecutará el método afterSingletonsInstantiated() del Bean. El código es el siguiente:
org. spring framework. eventlistenermethodprocessor # afteringletonstanted llamará al método privado ProcessBean() para crear ApplicationEventAdatper. El código es el siguiente:
El evento se puede llamar llamando al método de org. spring framework. abstractapplicationcontext # publicar evento (Java. lang. object, org. spring framework. core. tipo resoluble). El código es el siguiente:
Los códigos de multicasEvent, invokeListener y doInvokeListener en SimpleApplicationEventMasterer son los siguientes:
En SpringMVC, 9 componentes se inicializan a través del mecanismo de eventos de Spring.
Los oyentes se definen como clases internas en la clase FrameworkServlet. El código es el siguiente:
El oyente se agrega a la organización. marco de primavera .servlet web. Empaquetado a través de SourceFilteringListener.
Agregue el siguiente código:
Agréguelo en el método RegisterListeners en la actualización. El código es el siguiente:
En el método FinishRefresh() en Actualizar, llame a Publishevnet (Evento de actualización de nuevo contexto). (esto)) publicar eventos. Transmisión de multidifusión, el código es el siguiente
Eventualmente se transmitirá al frameworkservlet en el evento de la aplicación (evento).