我已在需要配置的网络服务中实施了一些授权。
目前,用户/密码组合已硬编码到bean配置中。我想将带有用户和密码的地图配置到application.properties中,以便配置可以是外部的。
关于如何做到这一点的任何线索?
<bean id="BasicAuthorizationInterceptor" class="com.test.BasicAuthAuthorizationInterceptor">
<property name="users">
<map>
<entry key="test1" value="test1"/>
<entry key="test2" value="test2"/>
</map>
</property>
</bean>
答案 0 :(得分:40)
您可以使用@ConfigurationProperties
将application.properties
中的值绑定到bean中。为此,您需要注释创建bean的@Bean
方法:
@Bean
@ConfigurationProperties
public BasicAuthAuthorizationInterceptor interceptor() {
return new BasicAuthAuthorizationInterceptor();
}
作为bean初始化的一部分,BasicAuthAuthorizationInterceptor
上的任何属性都将根据应用程序的环境进行设置。例如,如果这是你的bean的类:
public class BasicAuthAuthorizationInterceptor {
private Map<String, String> users = new HashMap<String, String>();
public Map<String, String> getUsers() {
return this.users;
}
}
这是你的application.properties:
users.alice=alpha
users.bob=bravo
然后users
地图将填充两个条目:alice:alpha
和bob:bravo
。
这是一个小样本应用程序,将所有这些放在一起:
import java.util.HashMap;
import java.util.Map;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableAutoConfiguration
@EnableConfigurationProperties
public class Application {
public static void main(String[] args) throws Exception {
System.out.println(SpringApplication.run(Application.class, args)
.getBean(BasicAuthAuthorizationInterceptor.class).getUsers());
}
@Bean
@ConfigurationProperties
public BasicAuthAuthorizationInterceptor interceptor() {
return new BasicAuthAuthorizationInterceptor();
}
public static class BasicAuthAuthorizationInterceptor {
private Map<String, String> users = new HashMap<String, String>();
public Map<String, String> getUsers() {
return this.users;
}
}
}
有关其各种配置选项的更多信息,请查看javadoc for ConfigurationProperties
。例如,您可以设置前缀以将配置划分为多个不同的命名空间:
@ConfigurationProperties(prefix="foo")
要使绑定起作用,您必须在application.properties中声明的属性上使用相同的前缀:
foo.users.alice=alpha
foo.users.bob=bravo
答案 1 :(得分:31)
您可以使用@Value
。
属性文件:
users={test1:'test1',test2:'test2'}
Java代码:
@Value("#{${users}}")
private Map<String,String> users;
答案 2 :(得分:6)
java.util.Properties
对象已经是Map
,实际上是HashTable
,后者又实现了Map
。
因此,当您创建属性文件(让我们将其命名为users.properties
)时,您应该可以使用PropertiesFactoryBean
或<util:properties />
加载它并将其注入您的班级。
test1=test1
test2=test2
然后执行类似
的操作<util:properties location="classpath:users.properties" id="users" />
<bean id="BasicAuthorizationInterceptor" class="com.test.BasicAuthAuthorizationInterceptor">
<property name="users" ref="users" />
</bean>
虽然如果你有一个Map<String, String>
作为用户属性的类型,它可能会失败...我不会将它们放在application.properties
文件中。但那可能只是我......
答案 3 :(得分:0)
我认为你正在寻找类似的东西
您可以类似地从.properties中选择值并将其指定给您的地图。