为了账号安全,请及时绑定邮箱和手机立即绑定

范围内的 Spring 事件可能吗?

范围内的 Spring 事件可能吗?

Go
开满天机 2021-05-31 09:11:01
Spring 事件机制支持发布应用程序事件并通过@EventListener注解在 Spring 组件内监听这些事件。但是,我在文档中找不到有关在特定范围内发送事件的任何信息。我对 Vaadin 的具体需求是:在用户交互的上下文中,发送事件(例如登录事件)此事件应仅由相同的 bean 使用@UIScope,即不应影响其他用户 UI那可能吗?注意:这并不是 Vaadin 特有的。我还可以询问如何使用 Spring web mvc 请求范围来完成。
查看完整描述

2 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

请看看这是否是您要找的:


主要应用:


   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();

    }



}


查看完整回答
反对 回复 2021-06-02
  • 2 回答
  • 0 关注
  • 190 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信