我想在两个不同的服务(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)!