AOP与Spring Boot建议不触发

时间:2016-05-13 03:29:27

标签: java spring spring-boot annotations aop

使用: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,因为另一件事很复杂,无论如何都没有工作。

1 个答案:

答案 0 :(得分:2)

您是否尝试将@EnableAspectJAutoProxy(proxyTargetClass=true)放在配置类上?