每个区域的单例实例

时间:2018-12-03 05:09:53

标签: java

我有一个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的单例实例的最佳方法是什么?

1 个答案:

答案 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);
    }



}