春天的可定制方面

时间:2018-05-02 10:06:38

标签: java spring customization spring-aop

我想在两个不同的服务(spring bean)上应用可自定义的方面。我的问题是如何/在何处设置/定义切入点表达式。通常在“虚拟方法”上或直接在建议方法上定义切入点表达式。但是,这意味着切入点是静态的(不可自定义)。 我想在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注释是在bean的定义上。因此,我可以将该方面重用于不同的目标。使用@ConditionalOnProperty,这将使我能够打开/关闭属性的单个方面。 谁能帮我这个?我怀疑我需要创建某种工厂,但似乎无法看到我如何用代理来替换已经定义的bean(服务bean)!

0 个答案:

没有答案