spring-属性赋值

1,658 阅读2分钟

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。