如何在spring框架中使用属性值作为固定值映射



我必须将属性值映射为公共静态不可变映射。

我在谷歌上搜索了很多代码的解决方案,但它们总是返回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);

相关内容

  • 没有找到相关文章

最新更新