使用:Spring Boot ::(v1.2.8.RELEASE)
我已经在build.gradle中使用aop启动器设置了一个Spring Boot应用程序
compile("org.springframework.boot:spring-boot-starter-aop")
我已经检查过,我正在获取依赖项:
| | | | +--- org.springframework:spring-aop:4.1.9.RELEASE
| | | | | +--- aopalliance:aopalliance:1.0
这是AspectConfig:
@Configuration
@ComponentScan
@EnableAspectJAutoProxy
public class AspectConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
我已将Configuration类放在应用程序层次结构的基础上,因此组件扫描只涵盖整个应用程序。这都是原型代码,但它最终会成为启动器模块的一部分,扫描所有区域的能力会有所帮助。
现在我已经定义了一个注释:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface AutowiredRestTemplate {
String name();
String methodUrl();
}
并有一个测试方法:
@Component(value = "testGateway")
public class TestGatewayImpl implements TestGateway {
private static final Logger LOG = LoggerFactory.getLogger(TestGatewayImpl.class);
AuspostRestTemplate restTemplate;
@AutowiredRestTemplate(name = "locations", methodUrl = "/fishing")
public Response doWork() {
LOG.debug("Got into gateway with restTemplate {}", restTemplate);
return restTemplate.getForObject(Response.class);
}
}
现在建议:
@Aspect
@Component
public class AutowiredRestTemplateAspect {
@Autowired
Map<String, AuspostRestTemplate> restTemplateMap;
@Autowired
private ApplicationContext context;
@Pointcut("execution(public * *(..))")
public void anyPublicMethod(){}
@Around("anyPublicMethod() && @annotation(autowiredRestTemplate)")
public Object inAnyMethod(ProceedingJoinPoint pjp, AutowiredRestTemplate autowiredRestTemplate) throws Throwable{
AuspostRestTemplate restTemplate = restTemplateMap.get(autowiredRestTemplate.name());
restTemplate.setMethodUrl(autowiredRestTemplate.methodUrl());
pjp.getTarget().getClass().getDeclaredField("restTemplate").set(pjp.getTarget(),restTemplate);
return pjp.proceed();
}
}
问题是,在运行doWork()
方法时,建议永远不会被触发。它甚至看起来从日志中可以看出切入点甚至无法设置。任何人都能看到这里的错误吗?
编辑:我已为我要使用的注释添加了配置以及保留和目标注释(在此问题的上方)。 EDIT2:更改了Configuration类上的ComponentScan,因为另一件事很复杂,无论如何都没有工作。
答案 0 :(得分:2)
您是否尝试将@EnableAspectJAutoProxy(proxyTargetClass=true)
放在配置类上?