欢迎来到代码驿站!

JAVA代码

当前位置:首页 > 软件编程 > JAVA代码

使用spring@value加载时机

时间:2023-02-22 09:38:09|栏目:JAVA代码|点击:

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 注解不能同时使用

上一篇:springBoot解决static和@Component遇到的bug

栏    目:JAVA代码

下一篇:SpringCloudGateway开发过程解析

本文标题:使用spring@value加载时机

本文地址:http://www.codeinn.net/misctech/226256.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有