2

我有一个 MongoService 课程

public class MongoService {

    private final Mongo mongo;
    private final String database;
    private static final Logger LOGGER = LoggerFactory.getLogger(MongoService.class);

    public MongoService(@Nonnull final String host, final int port, @Nonnull final String db) throws UnknownHostException {
        mongo = new Mongo(host, port);
        database = db;
    }

    public void putDocument(@Nonnull final DBObject document) {
        LOGGER.info("inserting document - " + document.toString());
        mongo.getDB(database).getCollection(getCollectionName(document)).insert(document, WriteConcern.SAFE);
    }

    public void putDocuments(@Nonnull final List<DBObject> documents) {
        for (final DBObject document : documents) {
            putDocument(document);
        }
    }

    @Nullable
    public <T extends DBObject> T getDocument(@Nonnull final T document) {
        final DBCollection collection = mongo.getDB(database).getCollection(getCollectionName(document));
        collection.setObjectClass(document.getClass());
        //noinspection unchecked
        return (T) collection.findOne(document);
    }

    @Nonnull
    public <T extends DBObject> List<T> getDocuments(@Nonnull final T document) {
        final List<DBObject> documents = new ArrayList<DBObject>();
        final DBCollection collection = mongo.getDB(database).getCollection(getCollectionName(document));
        collection.setObjectClass(document.getClass());
        final DBCursor dbCursor = collection.find();
        if (dbCursor != null) {
            documents.add(dbCursor.next());
        }
        //noinspection unchecked
        return (List<T>) documents;
    }
}  

我想创建一个此类的单例 bean,它从文件中读取主机、int、端口、数据库

问题

我将如何实现这一目标?

  • 从文件中提供配置参数的最佳方法是什么
  • 我如何使它成为单例豆?

我是 Spring 新手,真的不知道如何实现这一点

4

2 回答 2

4

Spring bean 默认情况下是单例的,所以..

@Service
public class MongoService

查看如何将属性值注入使用注释配置的 Spring Bean?对于注入属性,它非常漂亮。

于 2012-06-27T19:10:49.537 回答
1

您可以将值传递给构造函数,如下所示

<bean id="mongoService" class="MongoService">
  <constructor-arg name="host" type="java.lang.String" value="localhost"/>
  <constructor-arg name="port" type="long" value="1234"/>
  <constructor-arg name="db" type="java.lang.String" value="dbname"/>
</bean>

注意:这是 Spring 3 语法,旧版本不支持name参数,只需将其删除。

如果你想进一步外化属性,你可以这样做。

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="locations" value="jdbc.properties"/>
</bean>

<bean id="mongoService" class="MongoService">
  <constructor-arg name="host" type="java.lang.String" value="${host}"/>
  <constructor-arg name="port" type="long" value="${port}"/>
  <constructor-arg name="db" type="java.lang.String" value="${db}"/>
</bean>

确保 jdbc.properties 在您的类路径中。

jdbc.properties 中的条目

host=localhost
port=1234
db=dbname

编辑:对于你的第二个问题,这个mongoServicebean 默认是单例的。

于 2012-06-27T19:20:45.033 回答