0

我一直在创建基于注释的方面定义,因此创建@LogPerformance并将其放在createuser()方法上。在这种情况下,它不会调用方面方法。但是当我将 @LogPerformance 从createuser()创建()方法移动时,会调用方面方法。为什么 @LogPerformance不影响 createuser 方法。

@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
    {

    }

}
4

1 回答 1

1

我猜我们使用基于 Springs 代理的 AOP(你没有发布你的配置,所以我不得不猜测)。

这种基于代理的 AOP 仅在直接从其他 bean 调用建议的方法时才有效(因为随后也会调用代理)。但是,当您从同一个 bean 中调用建议的方法时(通过this),则不会调用代理,因此不会执行方面。(@参见 Spring 参考,第 9.6.1 章了解 AOP 代理

有两种解决方案:

例子:

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 方式,因为在使用自引用方式时,可能会忘记使用它

于 2015-01-27T10:15:20.430 回答