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

中国城乡与建设部网站关键词搜索站长工具

中国城乡与建设部网站,关键词搜索站长工具,中小企业网站建设公司首选,西安网站建设工程之前写过一篇关于介绍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/229.html

相关文章:

  • 做网站怎么做放大图片软文世界
  • wordpress b2b模板丁的老头seo博客
  • 网站建设需求分析的功能百度站长工具seo查询
  • 英文网站建设模板下载百度知道合伙人官网登录入口
  • 百度做网站为什么上阿里云备案专业的制作网站开发公司
  • 招牌做的好的网站有哪些竞价sem培训
  • 通州 网站建设网站优化方案模板
  • 网站做的图上传后字变得很模糊在线搜索资源
  • 个人网站优秀淘宝指数网址
  • 暂时没有域名怎么做网站广州搜索seo网站优化
  • 可以做旅游攻略的网站手机优化软件下载
  • 凡客诚品官网疑似关闭关键词的优化和推广
  • 湖南省建设监理协会网站淘宝指数官网入口
  • wordpress 唯艾迪东莞搜索优化十年乐云seo
  • 海宁网站怎么做seo佛山网站建设
  • wordpress插件 七牛河南seo推广
  • 免备案做网站可以盈利吗seo外链代发
  • 怎么制作网站链接手机今日头条重大消息
  • 怎么在手机上做网站百度手机网页版入口
  • 北京做网站制作的公司站长网站优化公司
  • java做网站不如php吗互联网推广销售好做吗
  • 中国建设工程网官方网站竞价排名的弊端
  • wordpress 主题2周前百度关键词优化排名
  • 有哪些网站可以做店面设计软件惠州关键词排名优化
  • 创建博客网站宣传推广方式
  • 租网站需要多少钱百度今日数据
  • 怎么查百度收录网站iis7站长工具
  • 社区推广普通话百度seo sem
  • 乌鲁木齐网站制作公司可靠吗长沙h5网站建设
  • 网站新媒体建设seo关键词推广公司