文章目录
背景
@Value 可以自动注入属性,来看下这里是如何实现的
实例类
@Component
public class User {
@Value("${address}")
String address;
}
AutowiredAnnotationBeanPostProcessor 类
这个类主要负责属性上有这两个注解的
Autowired.class
Value.class
@Override
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) {
InjectionMetadata metadata = findAutowiringMetadata(beanName, bean.getClass(), pvs);
try {
metadata.inject(bean, beanName, pvs);
}
catch (BeanCreationException ex) {
throw ex;
}
catch (Throwable ex) {
throw new BeanCreationException(beanName, "Injection of autowired dependencies failed", ex);
}
return pvs;
}
DefaultListableBeanFactory
doResolveDependency 这个方法
//如果这个属性是个string的,这里的例子是address,刚好会执行下面这个方法
if (value instanceof String) {
String strVal = resolveEmbeddedValue((String) value);
BeanDefinition bd = (beanName != null && containsBean(beanName) ?
getMergedBeanDefinition(beanName) : null);
value = evaluateBeanDefinitionString(strVal, bd);
}
PropertyPlaceholderHelper
取得具体的值
String propVal = placeholderResolver.resolvePlaceholder(placeholder);
placeholderResolver 的类是AbstractPropertyResolver
PropertySourcesPropertyResolver
@Nullable
protected <T> T getProperty(String key, Class<T> targetValueType, boolean resolveNestedPlaceholders) {
if (this.propertySources != null) {
for (PropertySource<?> propertySource : this.propertySources) {
if (logger.isTraceEnabled()) {
logger.trace("Searching for key '" + key + "' in PropertySource '" +
propertySource.getName() + "'");
}
//终于在这里取到值了
//propertySource 这个对象可以参考我的上文,在程序启动过程中设置的
Object value = propertySource.getProperty(key);
if (value != null) {
if (resolveNestedPlaceholders && value instanceof String) {
value = resolveNestedPlaceholders((String) value);
}
logKeyFound(key, propertySource, value);
return convertValueIfNecessary(value, targetValueType);
}
}
}
if (logger.isTraceEnabled()) {
logger.trace("Could not find key '" + key + "' in any property source");
}
return null;
}