Factory Configurations を使用すると、さまざまな構成に基づいて 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
- activate メソッドでは、構成を読み取り、それに基づいてサービスを登録します
- 非アクティブ化では、サービスを明示的に登録解除します
- エンド ユーザーは、名前で構成ファイルを作成します
<pid>-<some name>.cfg
。その後、DS はコンポーネントを有効にします。
<pid>-<some name>.cfg
次に、次のような名前の構成ファイルを (File Install などを使用して) 作成することにより、複数のインスタンスを作成できます。com.foo.factory-type1.cfg
そのような例については、 JdbcLoginModuleFactoryとそれに関連する構成を参照してください。
プレーンな OSGi を介して同じことを実現したい場合は、ManagedServiceFactoryを登録する必要があります。そのような例については、 JaasConfigFactoryを参照してください。
キーポイントはここにあります
- サービス プロパティとして構成 PID を使用して ManagedServiceFactory インスタンスを登録します。
- ManagedServiceFactory(String pid, Dictionary properties) コールバックで、構成プロパティに基づいて FooImpl のインスタンスを登録します。