代码之家  ›  专栏  ›  技术社区  ›  Steffen Harbich

范围内的春季活动是否可能?

  •  4
  • Steffen Harbich  · 技术社区  · 6 年前

    Spring事件机制支持通过 @EventListener 注释。但是,在 documentation . 我对vaadin的特殊需求是:

    • 在用户交互的上下文中,发送一个事件(例如登录事件)
    • 此事件只能由同一个 @UIScope ,即不应影响其他用户UI

    有可能吗? 注:这并不是瓦丹特有的。我还可以询问如何使用SpringWebMVC请求范围来完成。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Jeremy Grand    6 年前

    医生:我想它已经按你想要的方式工作了。

    长版本:

    文档对此有些不清楚,但尝试了一个简单的测试:

    发布事件的控制器:

    @Controller
    public class FooController {
        @Autowired
        private ApplicationEventPublisher publisher;
    
        @GetMapping("/fireEvent")
        public void fireEvent() {
            publisher.publishEvent(new FooEvent(this));
        }
    }
    

    还有一个听的有范围的豆子:

    @Scope(value = WebApplicationContext.SCOPE_REQUEST)
    @Component
    public class FooListener {
        @EventListener(FooEvent.class)
        public void listen() {
             System.out.println("I'm listening. PS : I am "+this.toString());
        }
    }
    

    当运行两个并发请求时,只有作用于同一个httpRequest的侦听器才能获取事件。


    我的解释 (不必看得很深,就拿一粒盐吃吧):

    在我看来 ApplicationEventMulticaster ListenerRetriever 使用BeanFactory获取以前注册为侦听器的bean(通过它们的名称)。显然,工厂将返回当前范围内的bean。

        2
  •  0
  •   fg78nc    6 年前

    请查看这是否是您要查找的内容:

    主要用途:

       package com.fg7.evision.EventList;
    
        import org.springframework.context.annotation.AnnotationConfigApplicationContext;
        import org.springframework.context.annotation.ComponentScan;
    
        @ComponentScan(basePackages = "com.fg7.evision.EventList")
        public class EventApplication {
    
    
            public static void main(String[] args) {
               MyScopedEvent event = new MyScopedEvent("hello world");
               AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(EventApplication.class);
                ctx.publishEvent(event);
            }
    
        }
    

    事件:

     package com.fg7.evision.EventList;
    
        public class MyScopedEvent  {
    
            private String message;
    
            public MyScopedEvent( String message) {
                this.message = message;
            }
    
            public String getMessage() {
                return message;
            }
        }
    

    事件侦听器的作用域仅限于单例作用域。

    package com.fg7.evision.EventList;
    
    import org.springframework.beans.factory.BeanNameAware;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.ConfigurableApplicationContext;
    import org.springframework.context.event.EventListener;
    import org.springframework.stereotype.Component;
    
    @Component(value = "listener")
    public class ScopedEventListener implements BeanNameAware {
    
        @Autowired
        ConfigurableApplicationContext context;
    
        String beanName;
    
        @Override
        public void setBeanName(String name) {
            this.beanName = name;
        }
    
        @EventListener(condition = "@listener.getScope() == 'singleton'")
        public void handleEvent(MyScopedEvent myScopedEvent) {
            System.out.println(myScopedEvent.getMessage());
    
        }
    
        public String getScope(){
            return this.context.getBeanFactory().getBeanDefinition(this.beanName).getScope();
        }
    
    
    }