Пятая серия Spring Boot. Сводка по использованию инъекций свойства Spring @Value.

Spring Boot

1. Внедрение @Value 2

в предыдущей статьеРезюме использования инъекций свойства Spring @Value 1Мы представили общие способы @Value. Прочитав статью, вы можете запутаться в разнице между #{..} и ${} и в том, как их использовать. В этой статье мы попытаемся решить эту проблему

1.1 Предпосылки

Файл свойств теста: advance_value_inject.properties

server.name=server1,server2,server3
#spelDefault.value=notdefault
HelloWorld_=sss

Тестовый класс AdvanceValueInject: представить файл advance_value_inject.properties как внедрение свойства

@Component
@PropertySource({"classpath:com/hry/spring/configinject/advance_value_inject.properties"})
public class AdvanceValueInject {
...
}

1.2 #{…} и ${…} ###

#{…}использование
Соответствующее значение в файле свойств можно получить через @Value("${spelDefault.value}"), но если такого свойства в файле свойств нет, будет сообщено об ошибке. Эту проблему можно решить, задав значения по умолчанию, например@Value("${spelDefault.value:127.0.0.1}")

Подробный код выглядит следующим образом:

    // 如果属性文件没有spelDefault.value,则会报错
    //  @Value("${spelDefault.value}")
    //  private String spelDefault2;

    // 使用default.value设置值,如果不存在则使用默认值
    @Value("${spelDefault.value:127.0.0.1}")
    private String spelDefault;

Использование ${…}
Содержимое {} в ${…} должно соответствовать выражению SpEL. Подробный синтаксис может быть представлен в новой статье в будущем. Здесь демонстрируется только простое использование:

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

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

${…} смешанный с #{…}
${...}和#{...}Его можно использовать в комбинации, как следующий порядок выполнения кода: получить значение из файла свойств через ${server.name} и заменить его, после чего становится выполнение выражения SpEL #{'server1,server2,server3 '.split(', ')}.

    // SpEL: 传入一个字符串,根据","切分后插入列表中, #{}和${}配置使用(注意单引号,注意不能反过来${}在外面,#{}在里面)
    @Value("#{'${server.name}'.split(',')}")
    private List<String> servers;

выше#{}外面,${}在里面Его можно успешно выполнить, а можно ли отменить?${}在外面,#{}在里面, как в коде

    // SpEL: 注意不能反过来${}在外面,#{}在里面,这个会执行失败
    @Value("${#{'HelloWorld'.concat('_')}}")
    private List<String> servers2;

Ответ - нет. Поскольку Spring выполняет ${} раньше, чем #{}. В этом случае Spring попытается найти #{'HelloWorld'.concat('_')} из свойства, тогда оно должно быть найдено. Если не будет найдено, сообщит об ошибке. так${}在外面,#{}在里面это незаконная операция

резюме

  • #{…} в основном используется для загрузки значений из внешних файлов свойств
  • ${…} используется для выполнения выражения SpEl и присвоения содержимого свойству
  • #{…} и ${…} можно смешивать, но обязательно#{}外面,${}在里面

2. Код

Смотрите код вышеGithub