Springboot项目中事件的发布和监听

在编写商品模块时用到了事件来完成业务场景,比如有商品表,商品收藏表,购物车商品表,当删除商品时,商品收藏表和购物车商品表中对应的商品也要删除。

首先定义商品删除事件
@Data
@ToString
@AllArgsConstructor
public class GoodsDeletedEvent {
    private long goodsId; // 商品ID
}
然后定义事件监听器

这里用的是注解@EventListener

	// 订阅商品删除
    // -删除购物车中的商品
    // -删除商品收藏中的商品
    @EventListener
    @Transactional
    public void onDeletedGoods(PayloadApplicationEvent<GoodsDeletedEvent> event) {
        GoodsDeletedEvent payload = event.getPayload();
        // 清除 用户购物车中已被删除的商品
        List<CartGoods> cartGoods = cartGoodsRepository.findByGoodsId(payload.getGoodsId());
        cartGoodsRepository.deleteInBatch(cartGoods);

        // 清除 商品收藏中已被删除的商品
        List<GoodsCollect> goodsCollects = goodsCollectRepository.findByProductId(String.valueOf(payload.getGoodsId()));
        goodsCollectRepository.deleteInBatch(goodsCollects);
    }
最后在需要的地方发布事件
@Transactional
    public void delete(long id) {
        if (goodsRepository.existsById(id)) {
            Goods ab = goodsRepository.getOne(id);
            ab.validate();
            goodsRepository.delete(ab);

            // 发布删除商品事件
            eventPublisher.publishEvent(new GoodsDeletedEvent(ab.getId()));
        } else {
            throw new RuntimeException("商品不存在");
        }
    }

这样一来,当控制层调用业务层的删除商品方法后,商品收藏和购物车商品中对应的商品也会一并删除。

下面有一个简单demo可以方便理解事件的发布监听应用

定义事件
@Data
@ToString
@AllArgsConstructor
public class DemoUserBeanEvent {
    //用户名
    private String name;
    //密码
    private String password;
}

因为公司项目都是DDD架构,所以以ApplicationService层代替Service层,不了解的没关系把AppService当做Service就行,代码一样可以直接用的
发布与监听都写在一个AppService中

@Service
@Slf4j
public class DemoUserAppService {
    /**
     * 事件发布由ApplicationContext对象管控的,发布事件前需要注入ApplicationContext对象调用publishEvent完成事件发布
     */
    @Autowired
    ApplicationContext applicationContext;

    /**
     * 用户注册方法 发布事件
     *
     * @param userBean
     */
    public void register(DemoUserBeanEvent userBean) {
        log.info("start=====================================================================");
        log.info("业务逻辑...");
        // 发布UserRegisterEvent事件,时间发布是由ApplicationContext对象管控的,
        applicationContext.publishEvent(new DemoUserBeanEvent(userBean.getName(),userBean.getPassword()));
    }

    /**
     * 监听事件
     * @param event
     */
    @EventListener
    public void onRegister(PayloadApplicationEvent<DemoUserBeanEvent> event) {
        // 获取注册用户对象
        DemoUserBeanEvent payload = event.getPayload();
        // 打印注册用户信息
        log.info("@EventListener注册信息,用户名:"+payload.getName()+",密码:"+payload.getPassword());
    }
}
控制层调用
@RestController
public class DemoUserController {
    @Autowired
    private DemoUserAppService demoUserAppService;

    @GetMapping("/register")
    public String register(DemoUserBeanEvent demoUserBean) {
        demoUserAppService.register(demoUserBean);
        return "注册成功!";
    }

}
启动springboot项目后 在浏览器输入 http://localhost:8001/register?name=xxp&password=ltd

在这里插入图片描述
事件的监听也不知道注解的方式,还有其他方式,可以看看别的文章比如这篇:https://blog.csdn.net/hjing123/article/details/89203524

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
springboot学习笔记 spring基础 Spring概述 Spring的简史 xml配置 注解配置 java配置 Spring概述 Spring的模块 核心容器CoreContainer Spring-Core Spring-Beans Spring-Context Spring-Context-Support Spring-Expression AOP Spring-AOP Spring-Aspects Messaging Spring-Messaging WEB Spring-Web Spring-Webmvc Spring-WebSocket Spring-Webmvc-Portlet 数据访问/集成(DataAccess/Intefration) Spring-JDBC Spring-TX Spring-ORM Spring-OXM Spring-JMS Spring的生态 Spring Boot Spring XD Spring Cloud Spring Data Spring Integration Spring Batch Spring Security Spring HATEOAS Spring Social Spring AMQP Spring Mobile Spring for Android Spring Web Flow Spring Web Services Spring LDAP Spring Session Spring项目快速搭建 Maven简介 Maven安装 Maven的pom.xml dependencies dependency 变量定义 编译插件 Spring项目的搭建 Spring Tool Suite https://spring.io/tools/sts/all IntelliJ IDEA NetBeans https://netbeans.org/downloads/ Spring基础配置 依赖注入 声明Bean的注解 @Component组件,没有明确的角色 @Service在业务逻辑层(service层) @Repository在数据访问层(dao层) @Controller在展现层(MVC→SpringMVC) 注入Bean的注解 @Autowired:Spring提供的注解 @Inject:JSR-330提供的注解 @Resource:JSR-250提供的注解 Java配置 @Configuration声明当前类是一个配置类 @Bean注解在方法上,声明当前方法的返回值为一个Bean AOP @Aspect 声明是一个切面 拦截规则@After @Before @Around PointCut JoinPoint Spring常用配置 Bean的Scope Singleton Prototype Request Session GlobalSession SpringEL和资源调用 注入普通字符 注入操作系统属性 注入表达式云算结果 注入其他Bean的属性 注入文件内容 注入网址内容 注入属性文件 Bean的初始化和销毁 Java配置方式 注解方式 Profile @Profile 通过设定jvm的spring.profiles.active参数 web项目设置在Servlet的context parameter 事件Application Event 自定义事件,集成ApplicationEvent 定义事件监听器,实现ApplicationListener 使用容器发布事件 Spring高级话题 Spring Aware BeanNameAware BeanFactoryAware

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值