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));
}