新建一个配置类MainConfigOfPropertyValues.java,在容器中加入Person类。
1.@Value赋值
使用xml配置文件的时候,可以在bean标签里指定property来设置属性的值。对应到注解的方式,有@Value注解。@Value注解是写在属性上的,表示给这个属性赋值,支持基本数值类型,支持#{}方式的SpEL表达式,支持${}从配置文件中取值,也就是取运行环境变量中的值。
// 基本数值
@Value("123")
private int age;
// 使用SpEL表达式赋值
@Value("#{1+2+3}")
private String name;
// 读取配置文件的值
@Value("${person.sex}")
private int sex;
2.@PropertySource加载外部配置文件
在配置文件目录下加入person.properties配置文件,加入person.sex=1。
使用xml的时候的做法是加入一行标签,指定配置文件的位置,后面才可以使用${}进行取值。
<context:property-placeholder location="classpath:person.properties"/>
使用注解的方式,也需要指定配置文件的位置,我们需要在主配置类上添加@PropertySource注解,在括号里指定配置文件的位置,可以一次写多个值来导入多个文件。
package com.atguigu.config;
import com.atguigu.bean.Person;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
@Configuration
// 读取配置文件的位置,将配置文件的值保存到环境变量中
@PropertySource({"classpath:/person.properties"})
public class MainConfigOfPropertyValues {
@Bean
public Person person() {
return new Person();
}
}
既然通过@PropertySource注解将配置文件加载到环境变量中了,那么我们还可以通过容器获取环境,再从环境中取出相应的值。
package com.atguigu;
import com.atguigu.bean.Person;
import com.atguigu.config.MainConfigOfPropertyValues;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
public class PropertyValuesTest {
@Test
public void test() {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MainConfigOfPropertyValues.class);
// 查看容器中的所有类
String[] beanDefinitionNames = annotationConfigApplicationContext.getBeanDefinitionNames();
for (String name : beanDefinitionNames) {
System.out.println(name);
}
// 输出person对象
Person person = (Person) annotationConfigApplicationContext.getBean("person");
System.out.println(person);
// 获取环境变量
ConfigurableEnvironment environment = annotationConfigApplicationContext.getEnvironment();
String sex = environment.getProperty("person.sex");
System.out.println("sex=" + sex);
annotationConfigApplicationContext.close();
}
}
另外还有@PropertySources注解,可以一次指定多个PropertySource。