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

免费做二维码网站东莞网站seo方法

免费做二维码网站,东莞网站seo方法,wordpress 输出作者,廉洁四川官方网权威发布图2 我们接着上一篇接着来看refresh方法#xff0c;我们上一小节说完了invokeBeanFactoryPostProcessors(beanFactory)方法#xff0c;这一节我们来看registerBeanPostProcessors(beanFactory)方法。 从方法名称定义我们就能看出这个方法主要是用来注册BeanPostProcesor的。…图2 我们接着上一篇接着来看refresh方法我们上一小节说完了invokeBeanFactoryPostProcessors(beanFactory)方法这一节我们来看registerBeanPostProcessors(beanFactory)方法。 从方法名称定义我们就能看出这个方法主要是用来注册BeanPostProcesor的。我们之前说过BeanPostProcesor的作用是在bean的初始化过程中作为后置处理器来对bean进行各种操作的所以在开始初始化bean之前需要把它们先找到并注册到spring容器中。 图2 -23行 我们接着看initMessageSource();方法该方法是向spring容器里添加一个MessageSource接口这个接口是一个策略接口支持对message进行国际化和参数化配置。也就是通过该接口的getMessage方法获取到的string类型的message消息可以支持国际化配置和参数化配置。具体使用例子我这里就不展开了我们主要还是关注spring的bean实例化及初始化过程吧。后面这些细节知识点我们都通过单独的专题文章来一一讲解。 图2-26行 initApplicationEventMulticaster();从该方法名称我们也可以猜出来这个方法是初始化一个ApplicationEventMulticaster对象到spring容器。那么该对象是干嘛的呢它负责传播ApplicationEvent事件的也就是当我们想想某类监听器发布一个事件时可以通过ApplicationEventMulticaster来实现。大概逻辑就是该对象里维护了spring容器内的所有监听器ApplicationListener当你通过它来发布事件时它会遍历所有的监听器并调用监听器的onApplicationEvent方法。是不是很简单大家可以自己点进去看下这个类的代码、 图2-29行 onRefresh();该方法在不同的applicationContext子类有不同的实现spring boot通过ServletWebServerApplicationContext的子类实现了tomcat容器的启动大家感兴趣的可以自行看下后面有时间也可以写篇单独的文章来看springboot和tomcat的结合及启动过程 图2-32行 registerListeners();方法我们从名字也能猜出个大概--注册ApplicationEvent事件的监听器上面我们已经通过initApplicationEventMulticaster()方法注册了事件传播器这里即将注册事件监听器这样有了事件就可以正常传播及执行了。 图2-35行 finishBeanFactoryInitialization(beanFactory);从该方法的注释我们就可以知道这个方法才是实例化并初始化我们写的所有对象的方法。我们跳开其他细节直接今日其调用的最核心的方法DefaultListableBeanFactory#preInstantiateSingletons下图3展示了该方法的核心代码。 图3 这部分代码一大串核心就是遍历所有的beanDefinitionNames集合调用getBean(beanName)方法进行bean的实例化及初始化。 上面一大串都是处理FactoryBean的逻辑不是我们讨论的重点。这里对FactoryBean做个简单的介绍。从名字看多少和BeanFactory有点像正好把单词bean和factory给反过来了。BeanFactory是spring创建及维护所有bean的地方而FactoryBean则可以理解为工厂模式通过它可以生成一类对象。其最核心的方法是getObject()方法返回一个对象实例比较典型的使用例子就是mybatis的mapper接口使用FactoryBean生成bean实例。后面我们讲bean的初始化过程还会讲到这里就先到这。接下来我们开始看getBean(beanName)方法。 图4 我们先看图4的242行的transformedBeanName(name)方法在看这个方法逻辑前我们先看看图3的beanName是怎么来的那故事还得回到spring扫描获取BeanDefinition的地方这时spring就会为我们生成beanName主要通过BeanNameGenerator#generateBeanName方法生成beanName。 主要逻辑是spring会先找Component或者javax.inject.Named等注解如果存在这些注解并且配置了value属性那么beanName就会使用这些注解的value属性否则就会使用当前class类的ShortName并使首字母小写来作为beanName。 说完了beanName的来源我们再来看看transformedBeanName(name)逻辑以及为什么要对参数name进行转换其实主要是针对传入的是bean的别名和FactoryBean的name两种情况。如果是别名的话需要转换为真实的beanName如果获取的bean是FactoryBean的话name前面会被额外拼接一个符号这个符号的作用只是告诉spring要获取的bean是FactoryBean本身而不是让FactoryBean管理的真实对象。这里大家可以看下图3的740行传入的name就是在beanName前面拼接了符号。 接着我们看图4-246行getSingleton(beanName)方法该方法会调用getSingleton(String beanName, boolean allowEarlyReference)方法第二个参数allowEarlyReference的意思是是否允许获取为初始化完成的实例通过getSingleton(beanName)方法调用时默认为true。 图5 我们看下图5的getSingleton(String beanName, boolean allowEarlyReference)方法该方法会先尝试从已完成初始化的容器singletonObjects中获取实例如果获取的实例为空且isSingletonCurrentlyInCreation(beanName)方法返回true则尝试从未完成初始化的容器earlySingletonObjects中获取实例。 这里的两个容器singletonObjects和earlySingletonObjects分别代表的是已经完成实例化和初始化的成熟bean和由于循环依赖而到这未完成初始化的提前暴露出去的bean。这里相信大家会有疑问为什么在singletonObjects容器返回空时要调用isSingletonCurrentlyInCreation(beanName)方法方法true才能从earlySingletonObjects获取实例呢 isSingletonCurrentlyInCreation(beanName)方法逻辑很简单就是判断beanName在不在singletonsCurrentlyInCreation集合里而添加时机是在创建bean之前在DefaultSingletonBeanRegistry#getSingleton(String,ObjectFactory)方法里。大家可以理解为如果这里isSingletonCurrentlyInCreation(beanName)方法返回true则表示当前beanName这个bean之前尝试创建过后面被打断了现在又来尝试创建了也就是出现了循环依赖了。 举个例子有两个类分别是A和BA依赖了BB也依赖了A。假设spring先初始化A这时候发现A依赖B所以在初始化A的过程中被打断跑去实例化并初始化B(注意这时候A的初始化过程被打断了)在初始化B的时候发现B又依赖Aspring又尝试去初始化A这时候调用getSingleton(String beanName, boolean allowEarlyReference)方法时(beanName为A)isSingletonCurrentlyInCreation(beanName)方法就会返回true。 那么我们假设如果这里不调用isSingletonCurrentlyInCreation(beanName)方法行不行我理解从业务逻辑上没什么影响但是影响性能如果没有这个判断那么所有的bean初始化过程都会在这里获取锁singletonObjects进行阻塞并往下走到183行逻辑才退出而有了这个判断为false表示是第一次创建该bean实例肯定不存在earlySingletonObject所以没必要获取锁往下走。 我们接着往下看当this.earlySingletonObjects.get(beanName)方法返回的对象也为空时且allowEarlyReference为true则尝试从singletonFactories容器中获取beanName的SingletonFactory该接口是单例工厂只有一个getObject()方法。此时如果获取的singletonFactory不为空则使用该单例工厂获取bean实例并放到earlySingletonObjects容器中并移除singletonObjects容器中的bean(其实此时该容器中一般不会有该beanName的值移除只是一种健全写法毕竟已经通过单例工厂生成了新的实例)。 此时大家可能有两个疑问该beanName的SingletonFactory是什么时候添加进去的 为什么获取的object对象要放到earlySingletonObjects容器中而不是singletonFactories容器呢带着疑问我们继续往下看。 说完图4的getSingleton(beanName);方法我们继续回头看图4--doGetBean方法中的其他方法。 由于第一次执行getSingleton(beanName);方法肯定是null所以执行else逻辑为了故事的延续我们继续对doGetBean方法进行分析。为了不让篇幅过长接下来的分析我们下篇接着分析。
http://www.w-s-a.com/news/374427/

相关文章:

  • 网站主页 优帮云深圳代做网站后台
  • app 与网站网站建设要做什么
  • 厦门国外网站建设公司郑州核酸点推vip服务
  • 免费网线seo外链怎么做
  • 宽带技术网网站wordpress widget hook
  • 山西省住房和城乡建设厅网站报名wordpress添加标签插件
  • 网站怎么自己做外贸网站案例
  • 做网站的优势公司网站怎么做站外链接
  • 海城网站制作建设精准营销的营销方式
  • 北京短视频拍摄公司重庆网站seo推广公司
  • 广州免费推广网站建设4399网页游戏大全
  • 网站的构架与组成建站公司兴田德润
  • php网站部署步骤邯郸哪有做网站的
  • 做设计什么设计比较好的网站南充市住房和城乡建设局考试网站
  • 郑州做系统集成的公司网站龙岩
  • 厦门SEO_厦门网站建设网络营销课程视频
  • vs 2015 网站开发开网店在线咨询
  • 前端如何优化网站性能大学学校类网站设计
  • 中国铁路建设投资公司网站熊学军中国it外包公司排名前50
  • 房产网站的建设广州推广排名
  • 湟源县网站建设wordpress删除未分类
  • 营销型网站开发推广厦门百度seo公司
  • 遵义网站开发培训上海中高风险地区名单最新
  • 禹州市门户网站建设做网站可以申请个体户么
  • 大良营销网站建设效果彩票网站搭建 做网站
  • 做网站的公司为什么人少了在中国如何推广外贸平台
  • 盘锦网站制作工业电商网站怎么配色
  • 白云企业网站建设seo排名点击软件
  • wordpress跨站脚本攻击漏洞国外注册的域名国内能用吗
  • 西部数码网站管理助手2工信部资质查询网站