深入浅出Spring/S防DDoSpringBoot 事件监听机制-墨者安全-墨者盾
DDOS防御_CC防护_高防CDN服务器_【墨者安全】—墨者盾墨者盾—你的网站贴身保镖!
QQ:800185041
高防免费接入:400-0797-119

渠道合作:156 2527 6999

主页 > CC防护 > 深入浅出Spring/S防DDoSpringBoot 事件监听机制

深入浅出Spring/S防DDoSpringBoot 事件监听机制

小墨安全管家 2020-05-28 12:54 CC防护 89 ℃
DDoS防御

Spring Boot事件

 

public abstract class AbstractApplicationContext extends DefaultResourceLoader 

深入浅出Spring/S防DDoSpringBoot 事件监听机制

底层公布事件依旧使用

    public void onApplicationEvent(MyApplicationEvent event) { 

@Component 

事件回忆:

        System.out.println("收到事件:" + event); 

ContextStartedEvent: Spring应用上下文启动事件;

        getApplicationEventMulticaster().multicastEvent(applicationEvent, eventType); 

        implements ConfigurableApplicationContext { 

                new AnnotationConfigApplicationContext(); 

                }) 

private void processBean(final String beanName, final Class<?> targetType) { 

    } 

Spring事件监听器为ApplicationListener,继承EventListener, 源码如下:

自定义事件对象:

            } 

事件对象:ApplicationStartedEvent ,事件源:SpringApplication 

      } 

public class ApplicationEventBootstrap { 

    } 

                    System.out.println("事件对象:" 

            listener.onApplicationEvent(event); 

ContextClosedEvent: Spring应用上下文关闭事件;

    public static void main(String[] args) { 

实例:

    public void onEvent(MyApplicationEvent event) { 

事件对象:ApplicationPreparedEvent ,事件源:SpringApplication 

启动服务并公布事件:

        // 结束 

     * @param source the object on which the event initially occurred (never {@code null}) 

自定义事件监听器:

        // 公布事件,事件源为Context 

        // 注册自定义事件监听器 

        context.addApplicationListener(new MyApplicationListener()); 

启动并公布事件:

 

经过源码我们能够看出,事件应该是经过

        AnnotationConfigApplicationContext context = 

面向接口编程,实现ApplicationListener接口:

                .web(WebApplicationType.NONE) 

 

EventObject对象不提供默认构造器,需要外部传递source参数,即用于记录并跟踪事件的来源;

public class SimpleApplicationEventMulticaster extends AbstractApplicationEventMulticaster 

SimpleApplicationEventMulticaster 对象,只是有些需要讲明的是,Spring Boot 1.4开始,SpringApplication和ApplicationContext使用的基本上

        ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event)); 

经过实例能够看出,上面两种方式都可正常公布和接收事件。

                .listeners(event -> { 

public abstract class ApplicationEvent extends EventObject { 

        // 异步 

    public static void main(String[] args) { 

使用注解 @EventListener实现Spring事件监听:

    public MyApplicationEvent(Object source) { 

    public static void main(String[] args) { 

 

        this.timestamp = System.currentTimeMillis(); 

能够看出,假如设置了Executor则异步发送,否则同步;而且能够看出经过 resolveDefaultEventType(event) 对公布的事件类型举行了校验,这算是为啥我们能够直截了当使用泛型来指定我们想接收的事件对象, 比如上面的 ApplicationListener。

        // 结束 

public interface ApplicationListener<E extends ApplicationEvent> extends EventListener { 

SimpleApplicationEventMulticaster实例,然而两者属于不同的对象(1.0 ~ 1.3版本是同一具对象);

Spring内建事件

事件对象:ApplicationContextInitializedEvent ,事件源:SpringApplication 

第三种实现的源码如下(

使用注解@EventListener,在初始化Bean之后,会在EventListenerMethodProcessor中举行处理和添加;

public class MyApplicationListener2 { 

 

  ...  

        AnnotationConfigApplicationContext context = 

        for (final ApplicationListener<?> listener : getApplicationListeners(event, type)) { 

最终就使用对应的ApplicationListener举行接收和处理就行了,这么ApplicationListener是啥时候注册的呢?

         

经过上面实例能够看出,context 能够公布事件,那底层是如何公布的,让我们然后看源码:

直截了当添加,使用content.addApplicationListener(上面实例中有使用);

        try { 

        super(source); 

    } 

事件对象:ContextClosedEvent ,事件源:AnnotationConfigApplicationContext 

                new AnnotationConfigApplicationContext(); 

                    + event.getClass().getSimpleName() 

            if (executor != null) { 

怎么添加ApplicationListener?

讲明

        context.publishEvent(new MyApplicationEvent(context)); 

    } 

        context.close(); 

实现原理

运行结果:

public void multicastEvent(final ApplicationEvent event, @Nullable ResolvableType eventType) { 

     * Create a new ApplicationEvent. 

                .close(); 

事件对象:ContextRefreshedEvent ,事件源:AnnotationConfigApplicationContext 

    } 

        // 启动上下文 

            else { 

面向接口编程,实现ApplicationListener接口;

事件对象:ApplicationReadyEvent ,事件源:SpringApplication 

  context.addApplicationListener(applicationListener);  

在Java中,事件对象基本上继承java.util.EventObject对象,事件监听器基本上java.util.EventListener实例;


DDoS防御

当前位置:主页 > CC防护 > 深入浅出Spring/S防DDoSpringBoot 事件监听机制

标签列表
DDoS防御
网站分类
X
 

QQ客服

400-0797-119