7

私は次のような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);
        }
    }

}

の値を外部プロパティファイル/storage/local.propertiesからコンストラクターhost, port, dbに挿入したい

### === MongoDB interaction === ###
host=127.0.0.1
port=27017
database=contract  

私のSpringワイヤーアップファイルは次のようになります
wireup.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd">

    <util:properties id="mongoProperties" location="file:///storage//local.properties" />

    <bean id="mongoService" class="com.business.persist.MongoService">
        // TODO
    </bean>
</beans>

質問

host, port, dbfrom local.propertiesfile の値を渡して、次のコンストラクターに渡すにはどうすればよいですか?

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

4 に答える 4

15

util:propertiesタグを使用してプロパティファイルをインポートする代わりに、context:property-placeholderを使用してインポートする必要があります。utilバージョンは、プロパティ値を構成に公開するのではなく、ファイルをプロパティオブジェクトとしてインポートするだけです。したがって、セットアップは次のようになります。

<context:property-placeholder location="file:///storage//local.properties"/>

次に、MongoServiceを接続するときに、コンストラクター構成で次のようなプロパティ名を使用できます。

<bean id="mongoService" class="com.business.persist.MongoService">
    <constructor-arg value="${host}"/>
    <constructor-arg value="${port}"/>
    <constructor-arg value="${database}"/>
</bean>

詳細については、春のドキュメントを参照してください。ちなみに、アプリケーションで定義されている可能性のある他のプロパティとの衝突を避けるために、各プロパティにわかりやすい名前を付けることを検討します。

于 2012-07-03T13:37:52.913 に答える
12

マイクショーンは完全に適切な答えを出しました。ここに1つの追加があります:あなたPropertyPlaceHolderConfigurerが正しく設定されたら、@Valueそれらのプロパティをコンストラクターに注入するために今日広く使用されているアノテーションを検討してください:

public class MongoService {

  ..

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

..
}
于 2015-10-28T17:22:23.797 に答える
5

プロパティプレースホルダーを定義します。

<context:property-placeholder location="classpath:path/to/your.properties"/>

そして今、プロパティを使用します:

<bean id="mongoService" class="com.business.persist.MongoService">
    <constructor-arg value="${property.foo}" />
    <constructor-arg value="${property.bar}" />
</bean>

参照:4.8.2.1例:PropertyPlaceholderConfigurer

于 2012-07-03T13:37:30.720 に答える
4

コンストラクターでSpringを読み取るapplication.propertiesには、次の例を使用できます。

// File: sample/Message.groovy

package sample
import org.springframework.beans.factory.annotation.*
import org.springframework.stereotype.*

@Component
class Message {

    final String text

    // Use @Autowired to get @Value to work.
    @Autowired
    Message(
        // Refer to configuration property
        // app.text to set value for
        // constructor argument text.
        @Value('${app.text}') final String text) {
        this.text = text
    }
}

出典:DZone

于 2018-07-25T09:31:23.937 に答える