настраиваемые аспекты весной - PullRequest
0 голосов
/ 02 мая 2018

Я хотел бы применить настраиваемый аспект для двух разных сервисов (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, это позволило бы мне включать / выключать отдельные аспекты на основе свойства. Кто-нибудь может мне с этим помочь? Я подозреваю, что мне нужно будет создать какую-то фабрику, но не могу понять, как я могу ЗАМЕНИТЬ уже определенный компонент (служебный компонент) с прокси!

...