2015-01-27 4 views
0

Я создал определение аспекта на основе аннотаций, создав таким образом @LogPerformance и положил его на метод createuser(). В этом случае он не вызывает метод аспект. Но когда я переместил @LogPerformance из createuser() для вызова метода метода метода create(). Почему @LogPerformance не влияет на метод createuser.Spring Aspect Logger

@Component 
@Path(SystemConstants.REST_REGISTER) 
public class RegisterServices { 

@PUT 
    @Path(SystemConstants.REST_REGISTER_CREATE) 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Produces({MediaType.APPLICATION_JSON}) 
    public Response create(@Context HttpServletRequest requestContex) String requestIp, String param) { 

     createUser(...); 

    } 


    @LogPerformance 
    public ClientRespWsBean createUser(ClientReqWsBean request) throws XMPPException 
    { 

    } 

} 
+0

Я думаю, если CreateUser() не в классе RegisterServices, он будет вызван –

+0

из кода, публикуемыми кажется вызов 'createUser' входит в' RegisterServices', таким образом, это простой вызов API. Однако, как вы уже отметили в комментариях, 'createUser' вызывается из другого жестко обработанного bean-компонента, он будет вызывать аспект' @ LogPerformance' –

ответ

1

Я предполагаю, что мы используем AOP Springs на основе прокси (вы не отправляли свою конфигурацию, поэтому я должен угадать).

Этот AOP на основе прокси-сервера работает только в том случае, если рекомендуемый метод вызывается непосредственно из другого компонента (потому что тогда также вызывается прокси-сервер). Но когда вы вызываете предложенный метод из одного и того же компонента (через this), тогда прокси не вызывается, и поэтому аспект не выполняется. (@see Spring Reference, Chapter 9.6.1 Understanding AOP proxies)

Есть два решения:

пример:

public class RegisterServices { 
    /* 
    * You must use @Resource instead of @Autowire 
    * https://jira.spring.io/browse/SPR-8450 
    * (and of course you need to enable @Resourse support first) 
    */ 
    @Resource private RegisterServices self; //self reference with proxy 
    ... 

    public Response create(...) { 
     this.self.createUser(...); 
    } 

    @LogPerformance 
    public ClientRespWsBean createUser(...){...} 
} 

Я предпочитаю путь AspectJ, потому что при использовании самостоятельно ссылочного пути, можно было бы забыть использовать его

+0

. Да, это единственный способ моего кода работать правильно. Но в этом случае необходимо изменить аналогичный блок кода, чтобы накладные расходы на дополнительный код. –

Смежные вопросы