【发布时间】:2021-10-27 19:35:20
【问题描述】:
在 Spring 中,我可以使用 @Value 注入配置各种对象,如 int、boolean、String 等。 我什至可以通过一次@Value 注入来配置整个地图结构。
假设我们有以下 TCP 服务器规范类:
public class TcpServerSpec {
private boolean enabled;
private String host;
private int port;
/* getters & setters */
}
我可以通过它们的名称注入几个服务器规范的映射,这样做......
@Value("${com.harry.potter.sockets}")
private HashMap<String, TcpServerSpec> sockets;
...具有以下 YAML 配置 (application-test1.yml):
com:
harry:
potter:
sockets:
server1:
enabled: true
host: host1
port: 1111
server2:
enabled: true
host: host2
port: 2222
但通常需要介于两者之间:只注入一个 TcpServerSpec:
@Value("${com.harry.potter.sockets.server1}")
private TcpServerSpec server1;
然后我可以成功通过以下测试:
@RunWith(SpringRunner.class)
@SpringBootTest
@ConfigurationProperties("com.harry.potter.sockets")
@TestPropertySource(locations = "classpath:application-test1.yml")
public class MyServerConfiguration1Test {
@Value("${com.harry.potter.sockets.server1}")
private TcpServerSpec server1;
@Value("${com.harry.potter.sockets.server2}")
private TcpServerSpec server2;
@Test
public void testServer1Spec() {
Assert.assertTrue(server1.isEnabled());
Assert.assertThat(server1.getHost(), is("host1"));
Assert.assertThat(server1.getPort(), is(1111));
}
@Test
public void testServer2Spec() {
Assert.assertTrue(server2.isEnabled());
Assert.assertThat(server2.getHost(), is("host2"));
Assert.assertThat(server2.getPort(), is(2222));
}
}
为什么这不可能? 还是这样?
【问题讨论】:
-
经过一些测试,我确实认为注入地图比简单地使用@Value 注释要复杂一些。
标签: java spring dependency-injection