当前位置: 首页 > news >正文

网络商城网站怎样做关键词优化网站的交流的功能怎么做

网络商城网站怎样做关键词优化,网站的交流的功能怎么做,织梦网站备案,深圳企业专业网站设计前言#xff1a; 我们知道在 Spring 、Spring Boot 的启动源码中都大量的使用了事件监听机制#xff0c;也就是我们说的的监听器#xff0c;监听器的实现基于观察者模式#xff0c;也就是我们所说的发布订阅模式#xff0c;这种模式可以在一定程度上实现代码的解耦#…前言 我们知道在 Spring 、Spring Boot 的启动源码中都大量的使用了事件监听机制也就是我们说的的监听器监听器的实现基于观察者模式也就是我们所说的发布订阅模式这种模式可以在一定程度上实现代码的解耦但如果想要实现系统层面的解耦那么就要使用消息队列了本篇从详细分析一下监听器的原理。 Spring Boot 系列文章传送门 Spring Boot 启动流程源码分析2 Spring Boot 启动流程源码分析2 Spring Boot 自动配置实现原理源码分析 Spring Boot 自定义 starter 启动器 事件监听器的核心元素 事件ApplicationEvent监听器触发的原因当事件源发生了某个事件对应的监听器就会被触发Spring 中场常见的事件 ContextRefreshEvent、ContextRStartEvent、ContextStoppedEvent、ContextCloseEvent、ReqyestHandlerEvent 等事件。监听器ApplicationListener监听特定事件并在事件内部定义了事件发生后的响应逻辑对应观察者模式的观察者。事件发布器ApplicationEventMulticaster负责发布事件维护事件和事件监听器之间的关系并在事件发生时通知相关监听器对应观察者模式中的被观察者。 监听器的工作流程 事件监听器注册到事件发起器用于监听事件。事件源产生事件然后像发布器发布事件。事件发布器回调事件监听器的回调方法。事件监听器的回调方法被调用执行业务。 事件发布器的初始化时机 事件发布器又叫事件多播器我们分析了事件监听器的工作流程其中事件监听器是要往事件发布器中注册的那意味着事件监听器开始注册之前已经有了事件发布器那事件发布器是什么时候初始化的呢事件发布器是在 AbstractApplicationContext#refresh 方法中调用了 AbstractApplicationContext#registerListeners 方法完成事件发布器的初始化如下 //初始化一个事件多播器 protected void initApplicationEventMulticaster() {//获取 beanFactoryConfigurableListableBeanFactory beanFactory this.getBeanFactory();//beanFactory 中是否有 应用程序事件多播器if (beanFactory.containsLocalBean(applicationEventMulticaster)) {//有直接赋值this.applicationEventMulticaster (ApplicationEventMulticaster)beanFactory.getBean(applicationEventMulticaster, ApplicationEventMulticaster.class);if (this.logger.isTraceEnabled()) {this.logger.trace(Using ApplicationEventMulticaster [ this.applicationEventMulticaster ]);}} else {//没有就创建一个 应用程序事件多播器this.applicationEventMulticaster new SimpleApplicationEventMulticaster(beanFactory);//应用程序事件多播器 注册到 beanFactory 中beanFactory.registerSingleton(applicationEventMulticaster, this.applicationEventMulticaster);if (this.logger.isTraceEnabled()) {this.logger.trace(No applicationEventMulticaster bean, using [ this.applicationEventMulticaster.getClass().getSimpleName() ]);}}}事件监听器的注册时机 事件监听器需要注册到事件发布器中那事件监听器是设么时候注册的监听器的注册是在 Spring 容器刷新的时候完成的AbstractApplicationContext#refresh 方法中调用了 AbstractApplicationContext#registerListeners 方法完成注册如下 //注册监听器 protected void registerListeners() {//准备遍历监听器Iterator var1 this.getApplicationListeners().iterator();while(var1.hasNext()) {ApplicationListener? listener (ApplicationListener)var1.next();//往 应用程序事件多播器 中添加监听器this.getApplicationEventMulticaster().addApplicationListener(listener);}//获取所有监听器String[] listenerBeanNames this.getBeanNamesForType(ApplicationListener.class, true, false);String[] var7 listenerBeanNames;int var3 listenerBeanNames.length;for(int var4 0; var4 var3; var4) {String listenerBeanName var7[var4];//往 应用程序事件多播器 中添加监听器this.getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);}//早期要处理的事件SetApplicationEvent earlyEventsToProcess this.earlyApplicationEvents;this.earlyApplicationEvents null;if (!CollectionUtils.isEmpty(earlyEventsToProcess)) {//有早期需要处理的事件Iterator var9 earlyEventsToProcess.iterator();//遍历派发出去while(var9.hasNext()) {ApplicationEvent earlyEvent (ApplicationEvent)var9.next();//使用 应用程序事件多播器 将事件派发出去 重点关注 multicastEvent 方法this.getApplicationEventMulticaster().multicastEvent(earlyEvent);}}}事件监听器在完成事件注册的时候最后会调用 SimpleApplicationEventMulticaster#multicastEvent 方法Spring Boot 源码中也会调用这段方法发布事件如下 //org.springframework.context.event.SimpleApplicationEventMulticaster#multicastEvent(org.springframework.context.ApplicationEvent) public void multicastEvent(ApplicationEvent event) {//调用 简单应用程序事件多播器 SimpleApplicationEventMulticaster#multicastEventthis.multicastEvent(event, this.resolveDefaultEventType(event)); }//org.springframework.context.event.SimpleApplicationEventMulticaster#multicastEvent(org.springframework.context.ApplicationEvent, org.springframework.core.ResolvableType) public void multicastEvent(ApplicationEvent event, Nullable ResolvableType eventType) {//解析事件类型ResolvableType type eventType ! null ? eventType : this.resolveDefaultEventType(event);//获取线程池Executor executor this.getTaskExecutor();//迭代遍历监听器Iterator var5 this.getApplicationListeners(event, type).iterator();while(var5.hasNext()) {//监听器ApplicationListener? listener (ApplicationListener)var5.next();if (executor ! null) {//线程池异步发送监听事件executor.execute(() - {this.invokeListener(listener, event);});} else {//同步发送监听事件this.invokeListener(listener, event);}}}SimpleApplicationEventMulticaster#multicastEvent 方法中可以发布异步事件如果事件发布器有线程池就可以发布异步事件。 事件发布器发布完成事件后又是怎么完成事件回调的 前面我们在分析事件发布的时候最后调用了 SimpleApplicationEventMulticaster#multicastEvent 方法SimpleApplicationEventMulticaster#multicastEvent 方法中又调用了 SimpleApplicationEventMulticaster#invokeListener 方法如下 //org.springframework.context.event.SimpleApplicationEventMulticaster#invokeListener protected void invokeListener(ApplicationListener? listener, ApplicationEvent event) {//获取 ErrorHandlerErrorHandler errorHandler this.getErrorHandler();//ErrorHandler 为空判断if (errorHandler ! null) {try {//不为空 调用 doInvokeListener 如果有异常 调用errorHandler 来处理this.doInvokeListener(listener, event);} catch (Throwable var5) {errorHandler.handleError(var5);}} else {//没有 errorHandler this.doInvokeListener(listener, event);}}//org.springframework.context.event.SimpleApplicationEventMulticaster#doInvokeListener private void doInvokeListener(ApplicationListener listener, ApplicationEvent event) {try {//执行监听器方法listener.onApplicationEvent(event);} catch (ClassCastException var6) {String msg var6.getMessage();if (msg ! null !this.matchesClassCastMessage(msg, event.getClass())) {throw var6;}Log logger LogFactory.getLog(this.getClass());if (logger.isTraceEnabled()) {logger.trace(Non-matching event type for listener: listener, var6);}}}FunctionalInterface public interface ApplicationListenerE extends ApplicationEvent extends EventListener {void onApplicationEvent(E var1); }SimpleApplicationEventMulticaster#invokeListener 方法会对是否有 ErrorHandler 进行不同的处理但最终都会调用 SimpleApplicationEventMulticaster#doInvokeListener 方法完成监听器方法的调用。 Spring Boot 是如何完成事件监听的 Spring Boot 在启动时候调用了 SpringApplication#run 方法SpringApplication#run 方法中有如下两行代码 //获取 SpringApplicationRunListener 实例数组 默认获取的是 EventPublishRunListener SpringApplicationRunListeners listeners this.getRunListeners(args); //启动监听 重点关注 listeners.starting(bootstrapContext, this.mainApplicationClass);我们接着分析 SpringApplicationRunListeners#starting 方法。 SpringApplicationRunListeners#starting 方法源码分析 SpringApplicationRunListeners#starting 方法最终调用了 SimpleApplicationEventMulticaster#multicastEvent 方法这个方法我们刚刚在上面分析了的至此回到了 Spring 的方法Spring Boot 和 Spring 事件监听机制原理基本相同。 //org.springframework.boot.SpringApplicationRunListeners#starting void starting() {//迭代遍历所有监听器Iterator var1 this.listeners.iterator();while(var1.hasNext()) {SpringApplicationRunListener listener (SpringApplicationRunListener)var1.next();//调用 事件发布运行监听器 EventPublishingRunListener#starting 方法listener.starting();}}//org.springframework.boot.context.event.EventPublishingRunListener#starting public void starting() {//调用 简单应用程序事件多播器 SimpleApplicationEventMulticaster#multicastEvent 多播事件 也就是启动监听事件this.initialMulticaster.multicastEvent(new ApplicationStartingEvent(this.application, this.args)); }Spring Boot 中事件发布器何时完成初始化的 我们知道 Spring 中事件发布器是在 AbstractApplicationContext#refresh 方法中完成初始化的的刚刚上面分析 Spring Boot 的事件发布流程中似乎没有时间发布器的初始化操作那 Spring Boot 事件发布器是何时初始化的请看如下代码 //org.springframework.boot.SpringApplicationRunListeners#starting void starting() {//迭代遍历所有监听器Iterator var1 this.listeners.iterator();while(var1.hasNext()) {SpringApplicationRunListener listener (SpringApplicationRunListener)var1.next();//调用 事件发布运行监听器 EventPublishingRunListener#starting 方法listener.starting();}}//org.springframework.boot.context.event.EventPublishingRunListener#starting public void starting() {//调用 简单应用程序事件多播器 SimpleApplicationEventMulticaster#multicastEvent 多播事件 也就是启动监听事件this.initialMulticaster.multicastEvent(new ApplicationStartingEvent(this.application, this.args)); }EventPublishingRunListener#starting 方法中直接使用了 SimpleApplicationEventMulticaster#multicastEvent 发布事件SimpleApplicationEventMulticaster 作为 EventPublishingRunListener 类的一个属性在创建 EventPublishingRunListener 对象时候已经初始化了。 EventPublishingRunListener 类源码分析 EventPublishingRunListener 这里只是看下构造方法事件发布器 SimpleApplicationEventMulticaster 作为 EventPublishingRunListener 的一个属性在 EventPublishingRunListener 完成创建的时候已经初始化了而 EventPublishingRunListener 又是通过 Spring Boot 自动注入完成创建的。 public class EventPublishingRunListener implements SpringApplicationRunListener, Ordered {private final SpringApplication application;private final String[] args;private final SimpleApplicationEventMulticaster initialMulticaster;public EventPublishingRunListener(SpringApplication application, String[] args) {this.application application;this.args args;this.initialMulticaster new SimpleApplicationEventMulticaster();Iterator var3 application.getListeners().iterator();while(var3.hasNext()) {ApplicationListener? listener (ApplicationListener)var3.next();this.initialMulticaster.addApplicationListener(listener);}}//省略部分代码。。。。 }总结Spring Boot 事件监听机制工作原理其实和 Spring 的事件监听机制原理一样Spring Boot 只是通过自动配置简化了一些复杂的配置而已如果我们熟读 Spring 的源码那对 Spring Boot 的源码解读是有极大帮助的Spring Boot 很多功能都是基于 Spring 的最后本篇关于 Spring Boot 事件监听机制工作原理的分享希望可以帮助到需要的小伙伴。 如有不正确的地方请各位指出纠正。
http://www.yayakq.cn/news/5412/

相关文章:

  • 建设网站必备条件手机商城积分兑换
  • 低代码建站平台网站建设创新互联
  • 广州市萝岗区做网站设计服务全国十大猎头公司
  • 荣耀手机商城官方网站下载优秀网文
  • 网站建设中 页面源代码简单游戏开发
  • 音乐网站建设视频教程汶上网站建设公司
  • 网站建设公司的正反免费素材哪个网站比较好
  • 广州建站模板厂家区域教育联盟网站建设
  • 十堰做网站的公司可以做网站头像的图片
  • 怎么做北京赛车网站app界面设计模板免费下载
  • 互联网定制网站找建筑图纸的网站
  • 北京建设网站合同下载wordpress中国可以用吗
  • 网站开发技术可行性分析微信公众号和小程序开发需要涉及
  • 网站建设售后服务合同网站建设怎么样
  • 网站科技感页面设计做网站的像素是多少钱
  • 东莞网站优化一般多少钱室内装修设计软件哪个好用
  • 湖南湘信建设工程有限公司网站wex5可以做网站吗
  • 导航类网站怎么做排名温州做企业网站
  • 会做网站怎么赚钱wordpress移动端显示
  • 太原网站制作案例wordpress新建页面显示数据
  • 贵阳h5网站建设古风头像在线制作免费
  • 深圳住房和建设局网站在哪个网网站建设与管理 需求分析
  • 网站可以自己做服务器么汕头生态建设典型案例
  • 湛江建站公司模板wordpress在php什么版本
  • 郑州网站营销推广公司有没有在线看片资源
  • 东莞做网站沃德东莞做工业产品网站建设
  • 教育网站建设平台店铺代运营服务
  • 网页制作与网站建设教程wordpress 文件管理插件
  • 东莞网站建设(信科分公司)网站域名证书
  • 手表网站 海马300米潜水表企业网站怎样做seo优化 应该如何做