使用出廠配置將允許您根據不同的配置創建FooImpl的不同實例。
例如,在聲明式服務,你可以創建一個像
import org.apache.felix.scr.annotations.*;
import org.apache.sling.commons.osgi.PropertiesUtil;
@Component(metatype = true,
name = FooImpl.SERVICE_PID,
configurationFactory = true,
specVersion = "1.1",
policy = ConfigurationPolicy.REQUIRE)
public class FooImpl implements IFoo
{
//The PID can also be defined in interface
public static final String SERVICE_PID = "com.foo.factory";
private static final String DEFAULT_BAR = "yahoo";
@Property
private static final String PROP_BAR = "bar";
@Property(intValue = 0)
static final String PROP_RANKING = "ranking";
private ServiceRegistration reg;
@Activate
public void activate(BundleContext context, Map<String, ?> conf)
throws InvalidSyntaxException
{
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put("type", PropertiesUtil.toString(config.get(PROP_BAR), DEFAULT_BAR));
props.put(Constants.SERVICE_RANKING,
PropertiesUtil.toInteger(config.get(PROP_RANKING), 0));
reg = context.registerService(IFoo.class.getName(), this, props);
}
@Deactivate
private void deactivate()
{
if (reg != null)
{
reg.unregister();
}
}
}
要點組件這裏是
- 您使用類型
configurationFactory
- 的一個組成部分。在你讀取配置的激活方法然後根據該註冊服務
- 停用您明確取消註冊服務
- 最終用戶將創建名稱爲
<pid>-<some name>.cfg
的配置文件。然後DS會激活組件。
然後你就可以通過(使用文件安裝等)與名<pid>-<some name>.cfg
文件中像com.foo.factory-type1.cfg
參考JdbcLoginModuleFactory及其相關config一個這樣的例子創建配置創建多個實例。
如果你想通過普通OSGi實現相同,那麼你需要註冊一個ManagedServiceFactory。一個這樣的例子參考JaasConfigFactory。
要點這裏是
- 您進行配置PID註冊ManagedServiceFactory實例作爲服務屬性
- 在ManagedServiceFactory(字符串PID,字典屬性)FooImpl的回調登記情況基礎上,配置屬性
請您提供更多詳情。我已經添加了部署註釋 - 服務應該如何顯示在系統中,特別是我無法理解新的顯示方式。cfg文件(由FileInstall管理)將引起出現'FooImpl'的新實例 – Dewfy 2013-04-07 07:47:24