Spring @Value 你是否有困惑,PlaceHolder为啥不生效呢?

2 篇文章 0 订阅
1 篇文章 0 订阅

Spring 不同版本在Context和Beans模块中你需要知道@Value注解字符串不能解析问题说明?
PlaceHolder替换流程如下:

org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization ->
org.springframework.beans.factory.support.AbstractBeanFactory.addEmbeddedValueResolver() ->
获取User对象:
从查询对象到构建对象的元信息
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean ->
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean ->
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean ->
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyMergedBeanDefinitionPostProcessors ->
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessMergedBeanDefinition ->
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.findAutowiringMetadata ->
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.buildAutowiringMetadata ->
属性赋值
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean ->
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties ->
org.springframework.beans.factory.annotation.InjectionMetadata.inject ->
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.AutowiredFieldElement.inject ->
org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency ->
org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency ->
org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue

下面代码

       for (StringValueResolver resolver : this.embeddedValueResolvers) {
   		result = resolver.resolveStringValue(result);
   		if (result == null) {
   			return null;
   		}
   	}
   这里的this.embeddedValueResolvers
    >=spring4.3.27  没有注入一个StringValueResolver 实现
   解决方案如下:
       新增一个配置Bean,配置Bean类实现BeanFactoryAware接口,然后在下面的方法中注入一个StringValueResolver实现
       @Override
       public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
           if (beanFactory instanceof DefaultListableBeanFactory){
               DefaultListableBeanFactory bf = (DefaultListableBeanFactory)beanFactory;
               bf.addEmbeddedValueResolver(strVal -> environment.resolvePlaceholders(strVal));
           }
       }
   >=spring4.3.27 && <spring5.X 注入一个实现
       代码位置:
           org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization()
               // 不存在内置值转换器的时候就会注入下面的解析器
               if (!beanFactory.hasEmbeddedValueResolver()) {
                   beanFactory.addEmbeddedValueResolver(new StringValueResolver() {
                       @Override
                       public String resolveStringValue(String strVal) {
                           return getEnvironment().resolvePlaceholders(strVal);
                       }
                   });
               }
   >= spring5.X  默认注入一个表达式实现的StringValueResolver
       代码位置:
           org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization()
               // 不存在内置值转换器的时候就会注入下面的解析器
               if (!beanFactory.hasEmbeddedValueResolver()) {
                   beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
               }  
              
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值