Annotates a method used to configure dynamic dependencies.
When this method is invoked, all required dependencies (except the ones declared with a
name
attribute) are already injected, and optional dependencies on class fields
are also already injected (possibly with NullObjects).
The purpose of the @Init method is to either declare more dynamic dependencies using the DM API, or to
return a Map used to dynamically configure dependencies that are annotated using a
name
attribute.
After the init method returns, the added or configured dependencies are then tracked, and when all dynamic
dependencies are injected, then the start method (annotated with @Start) is then invoked.
Usage Examples
In this sample, the "PersistenceImpl" component dynamically configures the "storage" dependency from the "init" method.
The dependency "required" flag and filter string are derived from an xml configuration that is already injected before the init
method.
@Component
public class PersistenceImpl implements Persistence {
// Injected before init.
@ServiceDependency
LogService log;
// Injected before init.
@ConfigurationDependency
void updated(Dictionary conf) {
if (conf != null) {
_xmlConfiguration = parseXmlConfiguration(conf.get("xmlConfiguration"));
}
}
// Parsed xml configuration, where we'll get our storage service filter and required dependency flag.
XmlConfiguration _xmlConfiguration;
// Injected after init (dependency filter is defined dynamically from our init method).
@ServiceDependency(name="storage")
Storage storage;
// Dynamically configure the dependency declared with a "storage" name.
@Init
Map<String, String> init() {
log.log(LogService.LOG_WARNING, "init: storage type=" + storageType + ", storageRequired=" + storageRequired);
Map<String, String> props = new HashMap<>();
props.put("storage.required", Boolean.toString(_xmlConfiguration.isStorageRequired()))
props.put("storage.filter", "(type=" + _xmlConfiguration.getStorageType() + ")");
return props;
}
// All dependencies injected, including dynamic dependencies defined from init method.
@Start
void start() {
log.log(LogService.LOG_WARNING, "start");
}
@Override
void store(String key, String value) {
storage.store(key, value);
}
}