使用spring@value加载时机
spring@value加载时机
@value是spring中一个用来注入类的成员变量的一种注解,其从配置文件中注入配置的值,需要在spring中配置下需要注入这个类PropertyPlaceholderConfigurer,有多种出入方式,如:
<bean id="propertyConfigurer" class="PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath*:config/*.properties</value> </list> </property> <property name="ignoreUnresolvablePlaceholders" value="true" /> <property name="fileEncoding" value="UTF-8"/> </bean>
@Value注入是在spring注入该类的默认构造器之后,再进行注入的。
使用
org.springframework.beans.BeanUtils的public static <T> T instantiateClass(Constructor<T> ctor, Object... args)
进行实例化@Component的类。使用这个bean工厂DefaultListableBeanFactory。
使用
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)
来创建这个bean的实例,mbd中是一些类似这样的数据:
scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null
默认情况下spring管理的bean都是单例。
实例构造完成之后,这个时候@Value注解就会触发,org.springframework.beans.factory.annotation。
AutowiredAnnotationBeanPostProcessor的inject(Object bean, String beanName, PropertyValues pvs)
这个方法就会将bean的属性注入进去了。
注入属性完成后(下图第557行),spring再去加载其他的bean。@Value其实也是使用了@AutoWire的机制。
由于spring只会在初始化时,加载这个类的构造器,如果需要修改配置文件中的值,可以通过spring上下文获取bean实例,使用set方式修改值。
@Value加载中文时出现乱码,可以在PropertyPlaceholderConfigurer配置编码格式,上文的code中有调到,也可将中文改成unicode编码。
说说@value注入时问题
@Value设置默认值
使用@Value注解将变量进行自动注入的时候,经常会出现的一个问题就是我们可能会由于在配置参数中忘记设置该参数造成整个项目报错,其实我们可以通过给被@Value注解作用的变量进行注入的时候如果没有找到该配置参数时设置一个默认值,相当于是一个兜底的方案:
没有默认值的用法:
@Value("${spring.port}") private String port;
增加默认值的用法:
@Value("${spring.port:8080}") private String port;
这里需要注意的是:
1.即使你的配置参数的值是String类型的话也不需要加双引号
2.被static修饰的变量通过@Value会注入失败
使用@Value注入配置值的时候报错
Consider defining a bean of type‘java.lang.String’ in your configuration.
这里是因为,我在同一个class 里面,引用了另一个注解@AllArgsConstructor
后面我对比删除了@AllArgsConstructor,只是留下@Value 。项目正常启动。
结论:@AllArgsConstructor 与 @Value 注解不能同时使用
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Java使用正则表达式检索、替换String中特定字符和正则表达式的一切
这篇文章主要给大家介绍了关于Java使用正则表达式检索、替换String中特定字符和正则表达式的一切,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-09-09Spring Cloud Stream微服务消息框架原理及实例解析
这篇文章主要介绍了Spring Cloud Stream微服务消息框架原理及实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2020-06-06Java springboot 配置文件与多环境配置与运行优先级
这篇文章主要介绍了Java springboot如何配置文件,进行多环境配置,以及运行优先级,感兴趣的小伙伴可以借鉴一下2023-04-04Spring Boot中使用Spring Retry重试框架的操作方法
这篇文章主要介绍了Spring Retry 在SpringBoot 中的应用,介绍了RetryTemplate配置的时候,需要设置的重试策略和退避策略,需要的朋友可以参考下2022-04-04
最新评论