Мне нравится ответ Закарии, но если вы находитесь в проекте, где ваша команда не хочет использовать этот подход, и вы застряли, пытаясь построить что-то с типом String, integer, float или примитивным типом из файла свойств в конструктор, то вы можете использовать аннотацию Spring @Value
для параметра в конструкторе.
Например, у меня возникла проблема, когда я пытался вставить строковое свойство в свой конструктор для класса, помеченного @Service
. Мой подход работает для @Service
, но я думаю, что этот подход должен работать с любым Java-классом Spring, если он имеет аннотацию (например, @Service
, @Component
и т. Д.), Которая указывает, что Spring будет одним из экземпляров класса, создающим.
Скажем, в каком-то yaml-файле (или любой другой конфигурации, которую вы используете) у вас есть что-то вроде этого:
some:
custom:
envProperty: "property-for-dev-environment"
и у вас есть конструктор:
@Service // I think this should work for @Component, or any annotation saying Spring is the one calling the constructor.
class MyClass {
...
MyClass(String property){
...
}
...
}
Это не будет работать, поскольку Spring не сможет найти строку envProperty
. Итак, это один из способов получить это значение:
class MyDynamoTable
import org.springframework.beans.factory.annotation.Value;
...
MyDynamoTable(@Value("${some.custom.envProperty}) String property){
...
}
...
В приведенном выше конструкторе Spring вызовет класс и знает, что при его вызове нужно использовать String "property-for-dev-environment"
, извлеченный из моей конфигурации yaml.
ПРИМЕЧАНИЕ: я считаю, что аннотация @Value предназначена для строк, промежуточных чисел и я считаю, что примитивные типы. Если вы пытаетесь передать пользовательские классы (beans), то подходы в ответах, определенных выше, работают.
person
SomeGuy
schedule
11.12.2020