Чтобы внедрить служебные свойства оригинального Sender в аспект LogSender, вы можете использовать подпись в DependencyActivatorBase (или DependencyManager), которая позволяет указать методы обратного вызова аспекта LogSender "добавить/изменить/удалить":
DependencyActivatorBase.createAspectService(
Class<?> serviceInterface,
String serviceFilter,
int ranking,
String add,
String change,
String remove);
Затем сигнатура метода обратных вызовов LogSenderAspect может принимать в качестве аргументов службу Sender, а также карту свойств службы Sender.
Теперь второе (более простое) решение — указать сервисный фильтр для вашего аспекта, и в этом случае; нет необходимости указывать какие-либо обратные вызовы.
давайте взглянем на первое решение с обратными вызовами, где аспект LogSender определяет метод «setSender (Sender, Map)», и тогда этот аспект будет регистрировать только метод «send» служб Sender, имеющих свойства службы «foo = bar» (здесь мы игнорируем обратные вызовы изменения/удаления сервиса):
public class Activator extends DependencyActivatorBase{
public void init(BundleContext ctx, DependencyManager dm) throws Exception {
Component logSender = createAspectService(Sender.class, null, 10, "setSender", null, null)
.setImplementation(LogSender.class)
.add(createServiceDependency().setService(LogService.class).setRequired(true));
dm.add(logSender);
}
}
class LogSender implements Sender {
volatile Sender sender;
volatile Map<String, Object> senderProperties;
volatile LogService log;
void setSender(Sender sender, Map<String, Object> senderProperties) {
this.sender = sender;
this.senderProperties = senderProperties;
}
@Override
public void send() {
if ("bar".equals(senderProperties.get("foo"))) {
log.log(LogService.LOG_DEBUG, "calling method send called on Sender service having properties foo=bar");
}
this.sender.send();
}
}
Теперь более простое решение состоит в использовании служебного фильтра "(foo=bar)" при определении вашего аспекта, и в этом случае нет необходимости использовать обратный вызов:
public class Activator extends DependencyActivatorBase{
public void init(BundleContext ctx, DependencyManager dm) throws Exception {
Component logSender = createAspectService(Sender.class, "(foo=bar)", 10)
.setImplementation(LogSender.class)
.add(createServiceDependency().setService(LogService.class).setRequired(true));
dm.add(logSender);
}
}
class LogSender implements Sender {
volatile Sender sender;
@Override
public void send() {
log.log(LogService.LOG_DEBUG, "calling method send called on Sender service having properties foo=bar");
this.sender.send();
}
}
это помогает? /Пьер
person
Pierre De Rop
schedule
21.01.2018