Spring基础组件的使用——@Value及@PropertySource

Spring基础组件的使用——@Value及@PropertySource

  • @Value
    • 基本值
    • Spring EL表达式
    • 读取配置文件
  • @PropertySource

@Value

@Value的作用是通过注解将常量、配置文件中的值、其他bean的属性值等注入到变量中,作为变量的初始值。

基本值

public class Dog {

    @Value("博美")
    private String name;
    @Value("2")
    private int age;

    public Dog() {
    }
    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

配置类如下

@Configuration
public class TestConfig {
    @Bean
    public Dog dog(){
        return new Dog();
    }
}

运行测试

public class TestMain {
    @Test
    public void test(){
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(TestConfig.class);
        Object dog = applicationContext.getBean("dog");
        System.out.println(dog);
    }
}

运行结果为

Dog{name='博美', age=2}

Spring EL表达式

@Value注解可以通过Spring EL进行简单的运算

public class Dog {
    @Value("博美")
    private String name;
    @Value("#{3*2}")
    private int age;
    ...
}

@Value注解可以通过Spring EL调用静态类及常量

    @Value("博美")
    private String name;
    @Value("#{T(Math).random()}")
    private int age;
    ...
}

@Value注解可以通过Spring EL调用其他Bean的值

@Configuration
public class TestConfig {
    @Bean
    public Dog dog(){
        return new Dog();
    }
    @Bean("jinMao")
    public Dog dog2(){
        return new Dog("金毛",5);
    }
}
public class Dog {
    @Value("#{jinMao.name}")
    private String name;
    @Value("#{jinMao.age}")
    private int age;
    //省略构造方法、setter、getter及toString方法
	...
}

@Value注解可以通过Spring EL使用简单的逻辑判断

public class Dog {
    @Value("#{jinMao.name}")
    private String name;
    @Value("#{jinMao.age> 2 ? 1 : 3}")
    private int age;
    @Value("#{jinMao.name eq '博美'}")
    private boolean isSales;
    //省略构造方法、setter、getter及toString方法
	...
}

@Value注解可以通过Spring EL使用正则

public class Dog {
    @Value("#{jinMao.name}")
    private String name;
    @Value("#{jinMao.age> 2 ? 1 : 3}")
    private int age;
    @Value("#{jinMao.age matches '\\d+' }")
    private boolean isDigit;
    //省略构造方法、setter、getter及toString方法
	...
}

读取配置文件

新建一个dog.properties文件

dog.name=柯基
dog.age=1

配置类

@Configuration
@PropertySource(value = "classpath:dog.properties",ignoreResourceNotFound = true,encoding = "UTF-8")
public class TestConfig {
    @Bean
    public Dog dog(){
        return new Dog();
    }
}

在使用PropertySource,可能会出现乱码,我们可以使用encoding指定编码类型为 UTF-8

Dog类

public class Dog {
    @Value("${dog.name}")
    private String name;
    @Value("${dog.age}")
    private int age;
    ...
}

运行测试类,打印结果为

Dog{name='柯基', age=1}

@PropertySource

@PropertySource注解将properties配置文件中的值存储到Spring的 Environment中,Environment接口提供方法去读取配置文件中的值,参数是properties文件中定义的key值。

接下来我们去验证一下是否存在我们的环境变量中

public class TestMain {
    @Test
    public void test(){
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(TestConfig.class);
        ConfigurableEnvironment environment = applicationContext.getEnvironment();
        System.out.println(environment.getProperty("dog.name"));
        System.out.println(environment.getProperty("dog.age"));
    }
}

打印结果为

柯基
1

你可能感兴趣的:(Spring)