Поскольку вы используете файл application.yml
, вам не нужно вручную загружать файл в контекст, так как это файл конфигурации по умолчанию для приложения spring
.Вы можете просто использовать их в @Component
оформленном классе, как показано ниже;
@Value("${app.max.size}")
private int size;
Если вы загружаете пользовательский файл YAML
, то это еще большая проблема в Spring.Используя @PropertySource
, вы не можете просто загружать файлы YAML.Это возможно, но мало работы требуется.Во-первых, вам нужна фабрика источника пользовательских свойств.В вашем случае, пользовательская фабрика источника свойств YAML.
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.support.EncodedResource;
import org.springframework.core.io.support.PropertySourceFactory;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Objects;
import java.util.Properties;
public class YamlPropertySourceFactory implements PropertySourceFactory {
/**
* Create a {@link PropertySource} that wraps the given resource.
*
* @param name the name of the property source
* @param resource the resource (potentially encoded) to wrap
* @return the new {@link PropertySource} (never {@code null})
* @throws IOException if resource resolution failed
*/
@Override
public PropertySource<?> createPropertySource(String name, EncodedResource resource)
throws IOException {
Properties properties = load(resource);
return new PropertiesPropertySource(name != null ? name :
Objects.requireNonNull(resource.getResource().getFilename(), "Some error message"),
properties);
}
/**
* Load properties from the YAML file.
*
* @param resource Instance of {@link EncodedResource}
* @return instance of properties
*/
private Properties load(EncodedResource resource) throws FileNotFoundException {
try {
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
factory.setResources(resource.getResource());
factory.afterPropertiesSet();
return factory.getObject();
} catch (IllegalStateException ex) {
/*
* Ignore resource not found.
*/
Throwable cause = ex.getCause();
if (cause instanceof FileNotFoundException) throw (FileNotFoundException) cause;
throw ex;
}
}
}
И вы должны указать @PropertySource
использовать эту фабрику вместо заводской по умолчанию, как показано ниже;
@Component
@PropertySource(value = "classpath:config-prop.yml", factory = YamlPropertySourceFactory.class) // Note the file name with the extension unlike a property file. Also, it's not the `application.yml` file.
public class ResourceProvider {
@Value("${app.max.size}")
private int size;
}
Вы можете использовать свои свойства, показанные вышеПеременная size
фрагмента кода.
Хотя.Если вы используете объявление массива YAML для получения свойств, это будет немного странным, даже если вы будете использовать этот способ.