@PropertySource和@Value注解的使用

432 阅读2分钟

日常工作中,我们需要把外部配置文件引入项目,不管是从apollo还是配置文件中拉取配置项,使用相应的注解都是最简洁的方法,现在总结一下相应的用法

演示功能

   1.@Value的用法

   2.@PropertySource加载外部配置文件

   3.通过environment获取外部配置的值

# @Value的用法和@PropertySource加载外部配置文件的演练

@Value修饰成员变量的用法总结

注入字符串
注入表达式计算结果
注入操作系统
注入函数表达式
注入URL表达式
注入自己(bean)的属性
注入其他bean的属性
注入文件资源
注入字符串表达式结果
注入外部配置文件字符串的表达式结果

实例:

@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Worker implements Serializable {
    private static final long serialVersionUID = 7387479910468805194L;
    @Value("roy")
    private String name;

    @Value("#{20-2}")
    private Integer age;

    @Value("#{systemProperties['os.name']}")
    private String systemPropertiesName;

    @Value("#{ T(java.lang.Math).random() * 100.0 }")
    private double randomNumber; //注入表达式结果

    @Value("http://www.baidu.com")
    private Resource url; // 注入URL资源

    // 注入其他Bean属性:注入person对象的属性name,注入的是自己的name值
    @Value("#{worker.name}")
    private String nikeName;

    @Value("#{person.name}")
    private String psersonName;

    @Value("${teacher.name}")
    private String teacherName;

    @Value("classpath:teacher.properties")
    private Resource resourceFile; // 注入文件资源

    // SpEL:调用字符串Hello World的concat方法,连接字符串
    @Value("#{'Hello World'.concat('!')}")
    private String helloWorld;

    // SpEL: 调用字符串的getBytes方法,然后调用length属性
    @Value("#{'Hello World'.bytes.length}")
    private String helloWorldbytes;

    @Value("#{'${server.name}'.split(',')}")
    private List<String> servers;
    
}

外部配置文件teacher.properties

teacher.name=roy
teacher.age=20
teacher.nickName=yawu
server.name=roy,jack,henghui

配置项:

使用@PropertySource加载配置文件

@Configuration
@PropertySource(value = {"classpath:teacher.properties"})
public class PropertyValueConfig {
    @Bean
    public Worker worker(){
        return new Worker();
    }
    @Bean
    public Person person(){
        Person person = new Person();
        person.setName("jack");
        return person;
    }
}

测试类:

/**
 * 测试bean的@value注入 ,注入字符串和表达式 Worker(name=roy, age=18, systemPropertiesName=Windows 10,
 * randomNumber=14.869541521378205, url=URL [http://www.baidu.com])
 */
@Test
public void testPropertyValue() {
  // 创建IOC容器
  AnnotationConfigApplicationContext context =
      new AnnotationConfigApplicationContext(PropertyValueConfig.class);
  String[] names = context.getBeanDefinitionNames();
  Arrays.stream(names).forEach(System.out::println);
  System.out.println("================================");
  Worker worker = (Worker) context.getBean("worker");
  System.out.println(worker);

}

测试结果:

Worker(name=roy, age=18, systemPropertiesName=Mac OS X, randomNumber=95.83436254541576, url=URL [http://www.baidu.com], nikeName=roy, psersonName=jack, teacherName=roy, resourceFile=class path resource [teacher.properties], helloWorld=Hello World!, helloWorldbytes=11, servers=[roy, jack, henghui])

通过environment获取外部配置的值

注入外部属性值的bean:

/** description: author:dingyawu date:created in 23:21 2020/12/6 history: */
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Teacher implements Serializable {
  private static final long serialVersionUID = 7387479910468805194L;

  @Value("${teacher.name}")
  private String name;

  @Value("${teacher.age}")
  private Integer age;

  @Value("${teacher.nickName}")
  private String nickName;

  public void init() {
    System.out.println("init。。。。。。。。。");
  }

  public void destroy() {
    System.out.println("destroy。。。。。。。。。");
  }
}

配置类:

/**
 * description:
 * author:dingyawu
 * date:created in 23:26 2020/12/6
 * history:
 */
@PropertySource(value = {"classpath:teacher.properties"})
@Configuration
public class TeacherValueConfig {
    @Bean
    public Teacher teacher(){
        return new Teacher();
    }
}

测试类:

/** 通过environment获取属性值 */
@Test
public void testPropertyValue03() {
  AnnotationConfigApplicationContext context =
      new AnnotationConfigApplicationContext(TeacherValueConfig.class);
  Environment environment = context.getEnvironment();
  String nickName = environment.getProperty("teacher.nickName");
  System.out.println(nickName);
}