话不多少,直接实战——用法,想懂理论的自行百度~
1.主要用了spring的发布消息、监听事件机制。
applicationEventPublisher发布事件→EventListener监听事件→执行异步操作。如图:
图1 applicationEventPublisher(注:spring4.2以后的版本才能发布object类型,之前的只能发布ApplicationEvent)
图2 构建一个Event,它只是一个普通的java类 (event类主要用于传参)
图3 利用注入的 ApplicationEventPublisher 把Event发布出去,监听器就能监听到该event并执行监听器
图 4 监听器
如图: 1.首先它是一个spring组件
2.必须声明它是异步的
3.声明它是一个监听器
4.方法中传递的参数表明它是监听哪个事件
5.从监听事件中取参
整体逻辑是:
主程序把事件发布出去,主程序就继续执行(保存用户注册信息到数据库),监听器监听到该事件就会执行监听器里的代码,两者同时进行比如监听器里执行的是访问某个服务(根据手机号查询归属地,然后更新到用户信息表里),这样用监听器实现异步的好处是:不必等查询归属地结束再保存用户信息,而且无论什么查询手机归属地更新用户信息是否成功,都不会影响 主程序保存用户信息。
主要是面向服务架构,很多逻辑都是需要访问不同的服务。
------------------------------------------------------------------------
后来发现ApplicationListener中的代码会执行两边
------------------------------------------------------------------------
1.原因:定位到问题是ApplicationListener中的代码执行了两遍,于是百度,说是项目同时集成spring和springmvc会创建两个容器,故会执行两次。
2.解决办法不要注入context
@Autowired
private ApplicationContext context;
用下面方法获取context
ContextLoader.getCurrentWebApplicationContext().publishEvent()
参考连接 :https://mahl1990.iteye.com/blog/2403911
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------