使用spring@value加载时机

目录
  • spring@value加载时机
  • 说说@Value注入时问题
    • @Value设置默认值
    • 使用@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 注解不能同时使用

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 详解Spring Boot 配置加载顺序及属性加载顺序

    先给大家介绍下spring boot 配置加载顺序,具体内容如下所示: 使用 Spring Boot 会涉及到各种各样的配置,如开发.测试.线上就至少 3 套配置信息了.Spring Boot 可以轻松的帮助我们使用相同的代码就能使开发.测试.线上环境使用不同的配置. 在 Spring Boot 里面,可以使用以下几种方式来加载配置.本章内容基于 Spring Boot 2.0 进行详解. 1.properties文件: 2.YAML文件: 3.系统环境变量: 4.命令行参数: 等等-- 我们可

  • Spring@Value属性注入使用方法解析

    这篇文章主要介绍了Spring@Value属性注入使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在使用Spring框架的项目中,@Value是使用比较频繁的注解之一,它的作用是将配置文件中key对应的值赋值给它标注的属性.在日常使用中我们常用的功能都比较简单,本篇文章系统的带大家来了解一下@Value的使用方法. @Value注入支持形式 @Value属性注入功能根据注入的内容来源可分为两类:通过配置文件的属性注入和通过非配置文件

  • Spring注解@Value及属性加载配置文件方式

    Spring中使用@Value注解给bean加载属性的配置文件有两种使用方式 第一种:使用@Value("#{configProperties['websit.msgname']}") spring中配置属性加载文件的配置方式 <bean id="configProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> <p

  • Spring 开发过程中Value 注解的使用场景

    Spring 开发过程中使用 Value 注解对属性进行赋值:常见的场景有三种. 直接对属性进行赋值:包括普通字符串.操作系统属性.文件内容等. 从配置文件中读取简单类型进行赋值:配置文件需要生效才可. 从配置文件中读取复杂类型进行赋值:如数组.Map.对象列表等. 一.直接对属性进行赋值 通过 @Value 将外部的值动态注入到Bean中,使用的情况有: 注入普通字符串 注入操作系统属性 注入表达式结果 注入其他Bean属性:注入beanInject对象的属性another 注入文件资源 注入

  • 使用spring@value加载时机

    目录 spring@value加载时机 说说@Value注入时问题 @Value设置默认值 使用@Value注入配置值的时候报错 spring@value加载时机 @value是spring中一个用来注入类的成员变量的一种注解,其从配置文件中注入配置的值,需要在spring中配置下需要注入这个类PropertyPlaceholderConfigurer,有多种出入方式,如: <bean id="propertyConfigurer" class="PropertyPla

  • 关于Spring配置文件加载方式变化引发的异常详解

    目录 问题背景 过程 定位 根因 配置加载顺序 解决 问题背景 我们项目的配置文件一直是通过Apollo进行管理,但是近期由于某些特殊的部署需求,需要使用K8S的原生对象来获取配置,如此一来的话,就需要使用环境变量spring.config.location来指定application.properties文件的路径,以便动态的获取配置. 说明:项目是一个dubbo项目,配置文件中主要包括一些基础组件的配置.以及dubbo相关的配置. 这时候问题来了,在所有配置及代码都没有变化的情况下,如果不指

  • spring启动加载程序的几种方法介绍

    关于在spring  容器初始化 bean 和销毁前所做的操作定义方式有三种: 第一种:通过注解@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; public class DataInitializer{ @PostConstruct public void initMethod() throw

  • Spring bean 加载执行顺序实例解析

    本文研究的主要是Spring bean 加载执行顺序的相关内容,具体如下. 问题来源: 有一个bean为A,一个bean为B.想要A在容器实例化的时候的一个属性name赋值为B的一个方法funB的返回值. 如果只是在A里单纯的写着: private B b; private String name = b.funb(); 会报错说nullpointException,因为这个时候b还没被set进来,所以为null. 解决办法为如下代码,同时学习下spring中 InitializingBean

  • spring如何加载配置多个配置文件

    这篇文章主要介绍了spring如何加载配置多个配置文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 为应用指定多个配置文件: 多个配置文件的关系: 并列 包含 并列关系 即有多个配置文件,需要同时加载这多个配置文件: 可以使用可变参数,数组和统配符进行加载: 可变参数 String config1 = "com/abc/di08/spring-student.xml"; String config2 = "com/abc/

  • spring boot加载freemarker模板路径的方法

    1,之前用的eclipse开发工具来加载spring boot加载freemarker模板路径,现在换用idea却不能使用了,所以来记录一下 加载freemarker模板三种方式,如下 public void setClassForTemplateLoading(Class clazz, String pathPrefix); public void setDirectoryForTemplateLoading(File dir) throws IOException; public void

  • 详解Spring ApplicationContext加载过程

    1.找准入口,使用ClassPathXmlApplicationContext的构造方法加载配置文件,用于加载classPath下的配置文件 //第一行,执行完成之后就完成了spring配置文件的加载,刷新spring上下文 ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext( "classpath:spring-mvc.xml"); //获取实例Bean Person person=con

  • spring boot 加载web容器tomcat流程源码分析

    我本地的springboot版本是2.5.1,后面的分析都是基于这个版本 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.1</version> <relativePath/> <!-- lookup parent fr

  • Spring中的spring.factories文件用法(Spring如何加载第三方Bean)

    目录 Spring的spring.factories文件用法 问题 解决 SpringBoot的扩展机制之Spring Factories 什么是 SPI机制 Spring Boot中的SPI机制 Spring Factories实现原理是什么 Spring Factories在Spring Boot中的应用 Spring的spring.factories文件用法 在springBoot中,它自动扫描包的时候,只会扫描自己模块下的类. 问题 如果我们不想被Spring容器管理的Bean的路径下不

  • Java类的加载时机与过程

    目录 1 开门见山 2 类的加载时机 3 何时开始类的初始化 4 被动引用例子 5 类的加载过程 5.1 加载 5.2验证 5.3准备 5.4 解析 5.5 初始化 1 开门见山 以前曾经看到过一个java的面试题,当时觉得此题很简单,可是自己把代码运行起来,可是结果并不是自己想象的那样.题目如下: class SingleTon { private static SingleTon singleTon = new SingleTon(); public static int count1; p

随机推荐