0

私は注釈ベースのアスペクト定義を作成していたので、それを作成してメソッド@LogPerformanceに配置しました。createuser()その場合、アスペクトメソッドは呼び出されませんが、 @LogPerformancecreateuser()を create() メソッドに移動すると、アスペクトメソッドが呼び出されます。@LogPerformancecreateuser メソッドに影響しないのはなぜですか 。

@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 Proxy Based AOP を使用していると思います (構成を投稿していないので、推測する必要があります)。

このプロキシ ベースの AOP は、アドバイスされたメソッドが他の Bean から直接呼び出された場合にのみ機能します (プロキシも呼び出されるため)。ただし、アドバイスされたメソッドを同じ Bean 内から ( 経由でthis) 呼び出すと、プロキシは呼び出されないため、アスペクトは実行されません。(@see Spring Reference, Chapter 9.6.1 Understanding AOP proxies )

次の 2 つの解決策があります。

例:

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 に答える