@Value源码解读

@Value提供自动注入值的功能:

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Value {

	String value();

}

其中,value可输入${}#{}:
${} : 配置文件、Environment variables、Program arguments、VM options等
#{} : SpEL表达式

@ValueAutowiredAnnotationBeanPostProcessor提供解析处理,AutowiredAnnotationBeanPostProcessor是创世的几个Bean之一,其加入Bean容器步骤如下:
在这里插入图片描述

// 支持解析@Autowired @Value 以及JSR-330的@Inject
public class AutowiredAnnotationBeanPostProcessor implements SmartInstantiationAwareBeanPostProcessor,
		MergedBeanDefinitionPostProcessor, PriorityOrdered, BeanFactoryAware {
	....
}

该类是一个BeanPostProcessor,对每一个Bean的初始化过程定义了很多了钩子做处理。

处理步骤及顺序是:

  1. MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition :扫描类中使用@Autowired@Value的元素,包括字段(静态字段不行)、构造函数、setter,扫描结果放入Map<String, InjectionMetadata> injectionMetadataCache
  2. SmartInstantiationAwareBeanPostProcessor#postProcessProperties :从injectionMetadataCache获取注解的元素,实施注入过程,其中对@Value传入的${}#{}进行解析。

以字段注解@Value为例:
最后走到了InjectionMetadata#inject -> AutowiredAnnotationBeanPostProcessor.AutowiredFieldElement#inject -> AutowiredAnnotationBeanPostProcessor.AutowiredFieldElement#resolveFieldValue -> DefaultListableBeanFactory#resolveDependency -> DefaultListableBeanFactory#doResolveDependency


public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory
		implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {
	...
	@Nullable
	public Object doResolveDependency(DependencyDescriptor descriptor, @Nullable String beanName,
			@Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException {

				if (value instanceof String) {
					// 解析${} 由PropertySourcePlaceHolderConfigurer$$Lambda解析
					String strVal = resolveEmbeddedValue((String) value);
					BeanDefinition bd = (beanName != null && containsBean(beanName) ?
							getMergedBeanDefinition(beanName) : null);
					// 解析#{}, 使用BeanExpressionResolver
					value = evaluateBeanDefinitionString(strVal, bd);
				}

	}
	...
}

此外,org.springframework.beans.factory.config.PlaceholderConfigurerSupport也能提供解析${}#{}的能力,默认解析${},可以继承该类自定义解析字符和解析方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

T.Y.Bao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值