使用工厂配置将允许您基于不同的配置创建不同的 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
- 在激活方法中,您读取配置,然后基于该注册服务
- 在停用时,您明确取消注册服务
- 然后,最终用户将使用 name 创建配置文件
<pid>-<some name>.cfg
。然后 DS 将激活该组件。
<pid>-<some name>.cfg
然后,您可以通过创建名称为like的配置(使用 File Install like)文件来创建多个实例com.foo.factory-type1.cfg
有关此类示例,请参阅JdbcLoginModuleFactory及其相关配置。
如果你想通过普通的 OSGi 实现相同的目标,那么你需要注册一个ManagedServiceFactory。有关此类示例,请参阅JaasConfigFactory。
这里的关键点是
- 您使用配置 PID 注册一个 ManagedServiceFactory 实例作为服务属性
- 在 ManagedServiceFactory(String pid, Dictionary properties) 回调中根据配置属性注册 FooImpl 的实例