Spring事件

Spring事件

事件

标识

在业务场景中有可能当A方法执行过程中需要调用B方法,但是不需要等待B方法处理完成,可以继续执行A方法,降低响应时间。

在spring中内置了这种事件机制来处理上述业务。需要使用到的两个注解为@EnableAsync,@Async

@EnableAsync:用于开启是否异步,不用该注解标识类则会默认事件为同步机制。

使用方式有两种:

​ 第一种是直接标识到B方法的类。

​ 第二种是使用配置方式:

@Configuration
@EnableAsync
public class SpringAsyncConfig { ... }

@Async:是标识哪个方法使用异步,没标识则视为同步处理。

发送事件

使用到的是@EventListenerApplicationEvent

@EventListener: 用于标注事件的方法。

ApplicationEvent:事件扩展内容。

使用方式:

// 事件方法
@Async
@EventListener
public void saveOntologyInstance(OntologyIdSaveEvent ontologyIdSaveEvent){
...
}
// 事件类
public class OntologyIdSaveEvent extends ApplicationEvent {
...
}
// 事件发送
applicationContext.publishEvent(new OntologyIdSaveEvent(this, ontologyInstanceIds));

问题

aop代理方式问题

先附上日志:

org.springframework.beans.factory.BeanInitializationException: 
Failed to process @EventListener annotation on bean with name 'neo4jServiceImpl'; 
nested exception is java.lang.IllegalStateException: 
Need to invoke method 'saveOntologyInstance' declared on target class 'Neo4jServiceImpl', 
but not found in any interface(s) of the exposed proxy type. Either pull the method up 
to an interface or switch to CGLIB proxies by enforcing proxy-target-class mode in your 
configuration.

日志提示的很明显,代理模式不对。

简单介绍一下spring中的aop两种模式:

cglib和jdk动态代理,简单一点就是jdk动态代理只针对接口的类生成代理,cglib针对实现类代理。

当接口没定义方法而事件调用了该方法时就会报这个错。

解决方式有两种:

​ 第一种在接口中定义该方法。

​ 第二种在@EnableAsync指定proxyTargetClasstrue强制使用cglib代理。

循环依赖问题

这个问题是一个很典型的问题,spring自己也给出了自己的处理方式,在业务中也应该尽量避免循环注入。

该问题产生原因是A方法调用B类的方法,B类通过spring注入了A方法所在的类就产生循环注入问题。

规避方式把事件方法抽离出来,形成独立的类,业务尽量解耦。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring事件存储指的是在Spring框架中实现事件管理和存储,以便在系统中进行事件的发布和订阅。它允许不同的组件之间进行解耦,以实现更好的系统可扩展性和灵活性。 Spring提供了一个事件体系结构,通过编写事件发布者和事件监听器,可以在应用程序中实现事件的发布和处理。事件发布者负责发布事件,而事件监听器负责处理该事件。 在实际应用中,Spring事件存储通常与其他持久化技术结合使用,以便将事件存储到持久化存储介质中,如数据库、消息队列或日志文件等。这样做的好处是可以跟踪和记录系统中发生的事件,并允许其他组件在需要时获取和处理这些事件Spring事件存储的实现方式可以基于数据库事务或非事务进行。对于基于数据库的实现方式,可以使用Spring提供的JDBC或ORM框架(如Hibernate)进行数据存储。对于非事务性的实现方式,可以使用消息队列或日志文件来存储事件。 除了事件存储,Spring还提供了其他一些功能来支持事件管理和处理,例如事件过滤、事件监听器排序和异步事件处理等。这些功能可以根据应用程序的需要进行配置和使用,以满足不同业务场景中的需求。 总而言之,Spring事件存储是一种利用Spring框架提供的事件模型和持久化技术来管理和存储事件的机制。它可以帮助系统实现解耦和灵活性,并提供跟踪、记录和处理事件的能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值