spring可以通过@Value的方式给对象的属性赋值,结合@PropertySource可以获取外部资源的值获取。
一、@Value
在通过xml的方式配置bean时,会通过如下方式给spring容器中的对象属性赋值:
<bean id="person" class="com.xyr.model.Person" >
<property name="age" value="18"></property>
<property name="name" value="xyr"></property>
</bean>此时通过配置文件获取spring容器当中的Person对象,就会看到person对象当中对应的属性值已经变为如下内容:
Person{age=18, name='xyr'}
除了通过在配置文件当中对对象赋值,也可以通过注解的方式赋值,@Value为属性赋值的方式有三种:
- 固定常量值
- 使用SPEL表达式#{}获取spring容器当中的值
- 使用${}获取配置文件当中的属性值
public class Cat {
@Value("喵喵")
private String name;
@Value("#{20-2}")
private int age;
@Value("${cat.nickName}")
private String nickName;
@Override
public String toString() {
return "cat 【 name = " + name + " age = " + age + " nickName = " + nickName + "】"; }
}其中#{}和${}区别就在于#{}获取spring容器当中的值当中的值,在给属性赋值时,会执行#{}当中的内容,并且将结果赋值给属性,如果#{}内的内容为字符串,则直接将字符串赋值给属性。而${}则用于文件当中的内容,主要会和下面要讲的@PropertySource合用
二、@PropertySource
spring通过@PropertySource注解的方式向Environment当中注册PropertySource,之后便可以从环境当中获取PropertySource内的属性,其中PropertySource以key/value的形式存在,比如,我们在项目中添加一个properties文件,并且添加如下配置:
cat.nickName=小喵喵我们可以通过environment获取到对应的值:
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringPropertiesValueConfig.class);
Environment environment = applicationContext.getEnvironment();
System.out.println(environment.getProperty("cat.nickName"));
}此时会答应出配置文件对应的值:小喵喵
当然我们也可以和@Value一同使用,来获取配置文件当中的值:
public class Cat {
@Value("${cat.nickName}")
private String nickName;
}这里要注意除了@PropertySource之外,还有一个注解@ImportResource也是我们经常用到的注解,它与@PropertySource区别在于:@PropertySource主要用于获取properties文件的值,而@ImportResource主要用于将以xml形式配置bean加入到当前配置的spring容器当中,它的功能有点类似于@Import导入Java配置文件,区别是它通过导入xml,解析xml内容来导入bean。