Я хотел бы применить настраиваемый аспект для двух разных сервисов (Spring Bean). Моя проблема заключается в том, как / где установить / определить выражение pointcut. Обычно определяется выражение pointcut для «фиктивного метода» или непосредственно для метода advice. Однако это означает, что pointcut является статическим (не настраивается).
Я хотел бы определить pointcut на уровне создания bean-компонента, чтобы иметь возможность создавать одинаковые рекомендации для разных целей. В идеале я хотел бы сделать что-то вроде этого:
@Aspect
public class ServiceAspect {
private static final Logger LOG = LoggerFactory.getLogger(ServiceAspect.class);
private final String discriminator;
// no advice defined here!!!
public ServiceAspect(String discriminator) { this.discriminator = discriminator; }
public Object around(ProceedingJoinPoint jp) throws Throwable {
LOG.info(discriminator + " called");
return jp.proceed();
}
}
@Configuration
@EnableAspectJAutoProxy
@PropertySource("classpath:application.properties")
public class ServiceConfiguration {
@Bean
public MyService service1() { return new MyServiceImpl(); }
@Bean
@Around("bean(service1)") // define the advice when bean is created
@ConditionalOnProperty("aspect1Enbaled")
public ServiceAspect aspect() {
return new ServiceAspect("Aspect-1");
}
@Bean
public YourService service2() { return new YourServiceImpl(); }
@Bean
@Around("bean(service2)") // define a different advice when bean is created
@ConditionalOnProperty("aspect2Enbaled")
public ServiceAspect aspect() {
return new ServiceAspect("Aspect-2");
}
}
Обратите внимание, что аннотация @Around относится к определению компонента. Таким образом, я могу повторно использовать аспект для другой цели. Используя @ConditionalOnProperty, это позволило бы мне включать / выключать отдельные аспекты на основе свойства.
Кто-нибудь может мне с этим помочь? Я подозреваю, что мне нужно будет создать какую-то фабрику, но не могу понять, как я могу ЗАМЕНИТЬ уже определенный компонент (служебный компонент) с прокси!