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

招远网站建设价格天津seo排名效果好

招远网站建设价格,天津seo排名效果好,今日最新国内新闻重大事件,做邮轮上哪个网站订票好之前写过一篇关于介绍Spring占位符替换原理的博客,传送门 :Spring的占位符是怎么工作的 在这篇文章基础上,再介绍一下Value替换原理,两篇文章有一定的相关性。 继续以上一篇的工程为例,项目结构一样,这里就…

之前写过一篇关于介绍Spring占位符替换原理的博客,传送门 :Spring的占位符是怎么工作的
在这篇文章基础上,再介绍一下@Value替换原理,两篇文章有一定的相关性。

继续以上一篇的工程为例,项目结构一样,这里就不再展示出来了,详情可查看上一篇文章。
另外我定义了一个类,内容如下

@RestController
@RequestMapping("/demo_client")
public class DemoClientController {//    @Value("${config.name}")
//    private String name;@Value("${my.property.key}")private String myPropertyName;
}

希望从配置中拿到配置,然后赋值给到myPropertyName属性。
说到赋值,那肯定会想到spring的依赖注入DI,很显然这个实现动态替换变量就是依赖注入原理完成的。Spring容器在启动过程中会先实例化对象,然后初始化,也就是填充对象属性。
@Value注解属性填充,它实现是通过一个叫AutowiredAnnotationBeanPostProcessor的bean前置处理器来完成的,它是一个BeanPostProcessor,Spring填充属性时候会调用其中postProcessProperties方法。

为什么是这个AutowiredAnnotationBeanPostProcessor类来处理的,要从bean生命周期来说了,这里不展开,稍微提下,
在这里插入图片描述
在这里插入图片描述
可以看到,凡是@Autowired和@Value都是交给它来填充属性的。

好,开始分析占位符变量替换过程.
在这里插入图片描述
工程启动后,会进入到org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean填充属性方法,变量BeanPostProcessor,其中就包含了AutowiredAnnotationBeanPostProcessor这个,打开看看它里面有什么东西。
在这里插入图片描述
其中有个缓存的东西,里面放了以beanName为key,Value是InjectionMetadata对象,即需依赖注入的对象。这些依赖注入的对象是在方法 applyMergedBeanDefinitionPostProcessors执行时预先放进去的,其实就是扫描解析所有带有@Autowired@Value@Resource@Inject等注解的bean,然后缓存到此cache.以便后面填充属性时使用,代码比较长,需要花点时间看看。

因为我们定义的是DemoClientController,所以找到它看看,果然是有2个属性。在这里插入图片描述
接着执行下一步,进入此方法
在这里插入图片描述
开始填充属性myPropertyName
在这里插入图片描述
继续深入
在这里插入图片描述
最终会进入到此方法
在这里插入图片描述
其中embeddedValueResolvers是PropertySourcesPropertyResolver以及PropertySourcesPlaceholderConfigurer,这两个对象是在属性填充之前已经准备好,上一篇文章最开始加载配置资源的也有提到,org.springframework.context.support.PropertySourcesPlaceholderConfigurer#postProcessBeanFactory方法,具体看这个方法。

接着请求方法resolveStringValue,所以会执行到PropertySourcesPlaceholderConfigurer的processProperties方法中去
在这里插入图片描述
这个方法上一篇文章已介绍过,最终会执行到以下方法
在这里插入图片描述
然后拿到my.property.key的值,最终spring容器会通过反射赋值到bean的属性,即DemoClientController#myPropertyName赋值完成。

好了,到这一步@Value注解流程解析完成。

另外,注意到上面的my.property.key配置,我是把它放在dev.properties中的,但在spring boot项目,我们一般喜欢放在application-xx.yml中,那么是不是流程会有区别? 接着再分析下这种情况:
先在application.yml定义一个名叫config.name的变量,如下

server:port: 8999
spring:application:name: eureka-service-1
config:name: huangd

DemoClientController稍微改动

@RestController
@RequestMapping("/demo_client")
public class DemoClientController {@Value("${config.name}")private String name;//    @Value("${my.property.key}")
//    private String myPropertyName;
}

将myPropertyName注释,改拿config.name配置。
跟之前一样启动工程,前面一部分没有任何变化,不同的地方在于,在这里插入图片描述
发现这时候不再是从name=localProperties这个对象中拿配置,而是从另外一个拿,

在这里插入图片描述是要从name='environmentProperties’中去拿配置,因为application.yml的配置是放在它里面的。还有从上图看到,发现它里面有9个对象,都是干什么的,我们不需要关心,反正肯定是针对某个场景取不同的对象,接着看它是从哪个对象拿配置的。在这里插入图片描述上图看到,执行到此方法这里,这也说明,就是从environment去拿的配置,好继续往下走,在这里插入图片描述开始遍历上面9个对象,找这个key为config.name的值,最终是在在这里插入图片描述
OriginTrackedMapPropertySource这里面找到了这个配置。
至于OriginTrackedMapPropertySource初始化是什么时候触发,它是在这个地方初始化的,应用启动时会执行到此步骤
在这里插入图片描述
拿到了配置值以后,后面的流程跟之前一样了,流程结束。

好了,两种加载配置方式都已经分析完成,大体上是一样的,只是根据配置key所在不同的配置文件读取来源不一样。

http://www.yidumall.com/news/55986.html

相关文章:

  • 购物网站开发总结报告seo专业推广
  • 党建网站建设内容丰富多彩模板建站的网站
  • 南昌网站建设利润北京seo网站优化培训
  • 专门做设计文案的网站怎么优化网站排名才能起来
  • 重庆市最新疫情整站优化案例
  • php手机网站制作搜索引擎是指什么
  • 一个只做百合的网站镇江搜索优化技巧
  • 企业网站做推广广告软文怎么写
  • 网站建设套餐介绍上海快速优化排名
  • 做网站设计要注意什么问题对网站提出的优化建议
  • 做中介最好用的网站搜索排名优化公司
  • 桥梁毕业设计代做网站谷歌外贸平台叫什么
  • wordpress图片付费主题seo超级外链发布
  • java开发工具有哪些优化公司怎么优化网站的
  • 如何做好网站建设内容的策划书怎样注册网站
  • 怎么制作做网站优化网站制作方法大全
  • asp网站做文件共享上传什么是市场营销
  • 那个网站做教学视频营销宣传方案
  • 深圳中高端网站建设怎么样做电商一个月能挣多少钱
  • 网站制作的电话软文内容
  • 网站怎么做cdn太原关键词排名优化
  • 网络营销推广公司网站有哪些建立网站的软件
  • 政务信息网站的建设的意义站长素材音效下载
  • 高端模板网站建设价格seo在线优化平台
  • seo优化实训报告seo对各类网站的作用
  • 东营有做网站的公司如何在百度打广告
  • 湘潭seo公司选择24火星南昌seo搜索优化
  • 一站式做网站多少钱营销案例分析报告模板
  • 保密管理咨询公司电子商务seo
  • 网站建设发票怎么开产品推广营销方案