我必须将属性值映射为公共静态不可变映射。
我在谷歌上搜索了很多代码的解决方案,但它们总是返回null。
我尝试了很多方法,但都不适合我。
示例代码
// properties
test.value=Hello
public interface TestObject {
String getValue();
}
@Component
public class TestOne implements TestObject {
@Value(${test.value})
private String value;
@Override
public String getValue() {
return value;
}
}
public class TestMap {
// I wanna load TestObject at here as Map
private static final Map<Integer, TestObject> hashMap = new HashMap<>();
public TestObject getTestObject(int num) {
return hashMap.get(num);
}
}
我的第一次尝试:使用静态块
/// TestMap(HashMap) up here
static {
hashMap.put(1, new TestOne());
hashMap.put(2, new TestTwo()); // another class what implements TestObject
....
}
我的第一次失败。我实现了在运行时创建的@Value注释。所以我尝试另一种方式。
我的第二个失败:singleton&实例块
/// TestMap(HashMap) up here
static TestMap testMap;
public static TestMap getInstance() {
if (testMap == null) instance = new TestMap();
return testMap;
}
{
hashMap.put(1, new TestOne());
hashMap.put(2, new TestTwo());
....
}
它仍然返回null,现在我开始非常困惑了。
我认为实例块将在实例初始化后创建。因此@Value将在实例块处执行。(因此@值注释映射属性值(
所以我认为这个代码可以毫无问题地运行。
TestObject object = TestMap.getInstance().getTestObject(1);
System.out.println(object.getValue());
但是它仍然返回null。
我是否误解了实例和静态?
或者我使用了错误的方式将属性值映射为不可变?
我还尝试了另一种在map中加载值的方法(缓存,另一种方法……(,但并不令人满意。
查看@Component
和@Autowired
注释。您可以用@Component
注释Testone
类,并将其注入到Testone testone
对象中,而不是创建Testone
类的新对象。
@Component
public class TestOne implements TestObject {
@Value(${test.value})
private String value;
@Override
public String getValue() {
return value;
}
}
和
@Autowired
TestOne testOne
hashMap.put(1, testOne);