我有一个Dynamo DB DAO类,该类采用us-east-1,us-east-2等区域来实例化对象并与DDB进行交互。 现在,我正在处理消息流,其中包含此区域值以及其他要写入DDB的有效负载。我想确保每个区域都创建一个DAO对象实例。 目前,我已经创建了一个地图,其中包含每个区域的所有Dao实例,并将其用于每个请求以实现此目的。
我正在使用的示例代码如下所示。
public class DDBDao {
private DynamoDBMapper dynamoDBMapper;
public DDBDao(final string region) {
AmazonDynamoDB dynamoDBClient = AmazonDynamoDBClientBuilder.standard()
.withRegion(Regions.fromName(region))
.build();
this.dynamoDBMapper = new DynamoDBMapper(dynamoDBClient);
}
public save(..) {
dynamoDBMapper.save(...)
}
....
}
@Singleton
public class DaoContainer {
Map<String, DDBDao> daoContainer = new HashMap<>();
DaoContainer() {
daoContainer.put("us-east-1", new DDBDao("us-east-1"));
daoContainer.put("us-east-2", new DDBDao("us-east-2"));
.....
}
}
我创建DaoContainer的实例,并获取给定区域的DDBDao与DynamoDB进行交互。 在每个区域中创建DDBDao的单例实例的最佳方法是什么?
答案 0 :(得分:0)
我建议实现自定义Region范围的bean,这与请求/会话范围的bean完全一样,只是spring将为每个Region维护bean对象。
org.springframework.beans.factory.config.Scope
是一个接口,通过实现它可以在spring容器中创建自定义范围
public class RegionScope implements Scope {
private final ThreadLocal regionScope = new ThreadLocal() {
protected Object initialValue() {
return new HashMap();
}
};
public Object get(String name, ObjectFactory objectFactory) {
Map scope = (Map) regionScope.get();
Object object = scope.get(name);
if (object == null) {
object = objectFactory.getObject();
scope.put(name, object);
}
return object;
}
public Object remove(String name) {
Map scope = (Map) regionScope.get();
return scope.remove(name);
}
}