模式10: External Configuration

 由  YiFei 发布

模式描述

外部配置可以让一个模块运行于不同的环境中。如下图所示,XML文件被Client类用来配置client.jar模块。可以注意到,负责初始化client.jar的配置信息与表示模块行为的Client类是分隔开的。

http://assets.osgi.com.cn/article/7289356/External.jpg

实现变种

配置一个模块去它的适应运行环境有多种方法。配置文件可以放在模块里,也可以单独放在另一个模块,或者两种方法同时使用。第一种方法的优点是在默认环境使用时变得简单,缺点是默认配置很可能在其他环境不能使用。第二种方法的优点是模块不再与环境耦合,从而可以在不同环境重用,而缺点是每个新环境都需要重写配置文件,而且没有缺省的配置。

结果

不提供外部配置会导致模块变得重量级,与单一环境紧密耦合。另一方面,外部配置会造成使用模块变得困难,因为模块在使用前必须对环境对配置,配置一个模块也需要开发者发时间去了解什么样才是合适的配置选择。概括起来,可以这样说:
外部配置增加模块复用性,但是降低可用性。

示例

很多系统都需要用户名和密码来连接外部资源,下面我们看一个使用外部配置的方式保证这个初始化模块的运行。

列表二展示了配置一个bean需要的userid(UUID)和password(PWD)。我们需要从外部文件中的uid和pwd去初始化InjectedBean类。

列表一 Simple Bean Configured with UID/PWD Combination

package com.extensiblejava.main;

public class InjectedBean implements InjectedInterface {
private String uid;
private String pwd;

public void setUid(String uid) { this.uid = uid; }
public void setPwd(String pwd) { this.pwd = pwd; }
public void injection() { System.out.println("uid: "  + uid + " pwd: " + pwd); }
}

列表二的是Resource.properties文件内容,包含初始化所需的uid和pwd。

列表二 Resource.properties With UID and PWD Combination

app.uid=springuid
app.pwd=springpwd

下面,我们要初始化列表一的InjectedBean,我们使用了Spring,列表三展示的是Spring的配置信息。

列表三 Spring Configuration File

<bean id="injectedBean" class="com.extensiblejava.main.InjectedBean">
    <property name="uid" value="${app.uid}"/>
    <property name="pwd" value="${app.pwd}"/>
</bean>

<bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="com/extensiblejava/main/Resource.properties"/>
</bean>

</beans>

总结

外部配置让模块能更好地被复用,但是过多的配置增加了开发人员使用模块的难度。我们在使用外部配置时需要找到一个平衡来达到最优策略,如果可能的话,提供一个缺省实现可以帮助达到目的。

查看评论