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