使用ApplicationEvent和Listener快速实现业务解耦

该博客介绍了如何在Spring框架中通过ApplicationContextAware获取上下文,并利用@EventListener监听ApplicationEventTest事件,结合@Async注解实现异步处理。首先定义了一个ApplicationEventTest事件类,然后创建了ApplicationEventListenTest监听器,通过@Async开启异步处理。在测试方法中,通过发布事件启动监听器,展示了异步执行的流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过ApplicationContextAware获取上下文,然后监听实现异步操作
先定义一个监听事件

public class ApplicationEventTest extends ApplicationEvent {
    /**
     * Create a new {@code ApplicationEvent}.
     *
     * @param source the object on which the event initially occurred or with
     *               which the event is associated (never {@code null})
     */
    public ApplicationEventTest(Object source) {
        super(source);
    }
}

创建监听主体容器

@Service//@EventLsitener需要在component执行
public class ApplicationEventListenTest {
    @Order
    @EventListener(ApplicationEventTest.class)//监听规定事件
    //默认这种事件机制是同步的
    @Async//开启异步
    public void applicationEventTest(ApplicationEventTest event) {
        String jsonStr = JSONUtil.toJsonStr(event.getSource());
        JSONObject parse = (JSONObject)JSONObject.parse(jsonStr);
        System.out.println("parse = " + parse);
        try {
            System.out.println("测试异步" +1 );
            TimeUnit.SECONDS.sleep(2);
            System.out.println("测试异步" +2 );
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

实现

    @Autowired
    private ApplicationContext applicationContext;
    @Autowired
    private InnerCalssAsync innerCalssAsync;
    @Autowired
    private DiaService diaService;
    @GetMapping("/run")
    public void run(){
        eventParam eventParam = new eventParam();
        eventParam.setKey("key");
        eventParam.setName("name");
        //上下文去推事件触发监听器
//        innerCalssAsync.asyncRun();//跨类async才生效:原因是async走aop,同一个类型没走代理
        SpringContextHolder.publishEvent(new ApplicationEventTest(eventParam));//对applicationContext判空
        System.out.println("测试异步" +3 );
//        applicationContext.publishEvent(new ApplicationEventTest(eventParam));

只要监听事件和监听容器,监听容器具体实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值