💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
使用`@Value("${property}")`注解来注入配置属性有时会很麻烦,特别是如果您正在使用多个属性或者您的数据本质上是分层的。 Spring Boot提供了一种使用属性的替代方法,该方法允许强类型bean管理和验证应用程序的配置,如以下示例所示: ~~~java package com.example; import java.net.InetAddress; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.springframework.boot.context.properties.ConfigurationProperties; @ConfigurationProperties("acme") public class AcmeProperties { private boolean enabled; private InetAddress remoteAddress; private final Security security = new Security(); public boolean isEnabled() { ... } public void setEnabled(boolean enabled) { ... } public InetAddress getRemoteAddress() { ... } public void setRemoteAddress(InetAddress remoteAddress) { ... } public Security getSecurity() { ... } public static class Security { private String username; private String password; private List<String> roles = new ArrayList<>(Collections.singleton("USER")); public String getUsername() { ... } public void setUsername(String username) { ... } public String getPassword() { ... } public void setPassword(String password) { ... } public List<String> getRoles() { ... } public void setRoles(List<String> roles) { ... } } } ~~~ 上的对象定义了下面的属性 * acme.enabled,默认值false * acme.remote-address,从String转换而来 * acme.security.username,使用内部类`security` * acme.security.password * acme.security.roles,使用了`String`的集合 你还要把配置类注册到`@EnableConfigurationProperties`,如下所示: ~~~ @Configuration @EnableConfigurationProperties(AcmeProperties.class) public class MyConfiguration { } ~~~ > `@ConfigurationProperties`bean注册之后,bean的常规name是`<prefix>-<fqn>`,其中`<prefix>`是 `@ConfigurationProperties`注解时指定的前缀值, > `<fqn>`是全限定类名称,上面的示例bean名称为`acme-com.example.AcmeProperties`,如果不设置前缀,那么就是`com.example.AcmeProperties` > 即使前面的配置为`AcmeProperties`创建了一个常规bean,我们也建议`@ConfigurationProperties`只处理环境,特别是不从上下文中注入其他bean。 话虽如此,`@ EnableConfigurationProperties`注解也会自动应用于您的项目,以便从`Environment`配置任何使用`@ConfigurationProperties`注解的bean。 您可以通过`MyConfiguration `确保`AcmeProperties`已经是一个bean,如以下示例所示: ~~~ @Component @ConfigurationProperties(prefix="acme") public class AcmeProperties { // ... see the preceding example } ~~~ 使用`@ConfigurationProperties`,像使用其他bean那样注入接口,如下所示: ~~~ @Service public class MyService { private final AcmeProperties properties; @Autowired public MyService(AcmeProperties properties) { this.properties = properties; } //... @PostConstruct public void openConnection() { Server server = new Server(this.properties.getRemoteAddress()); // ... } } ~~~