2017-03-08 7 views
2

単純なアスペクトでメソッドの入出力パラメータを記録しています。Spring AOPロギングとキャッシュ

package com.mk.cache; 

import org.aspectj.lang.ProceedingJoinPoint; 
import org.aspectj.lang.annotation.Around; 
import org.aspectj.lang.annotation.Aspect; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.stereotype.Component; 

import java.util.Arrays; 

@Aspect 
@Component 
public class LoggingAspect { 
    @Around("within(@com.mk.cache.LoggedIO *) && execution(* *(..))") 
    public Object logAroundPublicMethod(ProceedingJoinPoint joinPoint) throws Throwable { 
     String wrappedClassName = joinPoint.getSignature().getDeclaringTypeName(); 
     Logger LOGGER = LoggerFactory.getLogger(wrappedClassName); 
     String methodName = joinPoint.getSignature().getName(); 
    LOGGER.info("LOG by AOP - invoking {}({})", methodName, Arrays.toString(joinPoint.getArgs())); 
    Object result = joinPoint.proceed(); 
    LOGGER.info("LOG by AOP - result of {}={}", methodName, result); 
     return result; 
    } 
} 

この注釈で添付されています。

package com.mk.cache; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.cache.annotation.Cacheable; 
import org.springframework.stereotype.Service; 

@Service 
@LoggedIO 
public class CachedService { 

    private static final Logger LOGGER = LoggerFactory.getLogger(CachedService.class); 

    @Cacheable("myCacheGet") 
    public int getInt(int input) { 
     LOGGER.info("Doing real work"); 
     return input; 
    } 
} 

Iはまた、春キャッシュを使用します。私は(@LoggedIOに気付く)。このような方法の入力と出力を記録するためにこのメカニズムを使用

package com.mk.cache; 

public @interface LoggedIO { 

} 

。ここに、サンプルアプリケーションがあります。

package com.mk.cache; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.boot.CommandLineRunner; 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.cache.annotation.EnableCaching; 

@SpringBootApplication 
@EnableCaching 
public class CacheApplication implements CommandLineRunner { 

    private static final Logger LOGGER = LoggerFactory.getLogger(CacheApplication.class); 

    public static void main(String[] args) { 
     SpringApplication.run(CacheApplication.class, args); 
    } 

    @Autowired 
    private CachedService cachedService; 

    @Override 
    public void run(String... args) throws Exception { 
     LOGGER.info("cachedService.getInt(1)={}", cachedService.getInt(1)); 
     LOGGER.info("cachedService.getInt(1)={}", cachedService.getInt(1)); 
    } 
} 

出力は次のようになります。

LOG by AOP - invoking getInt([1]) 
Doing real work 
LOG by AOP - result of getInt=1 
cachedService.getInt(1)=1 
cachedService.getInt(1)=1 

私の問題は、私は二度目のLOGGER.info("cachedService.getInt(1)={}", cachedService.getInt(1));を呼び出すときに、キャッシュされた値が使用されていること、であるが、入力および出力パラメータが記録されません、キャッシュは最初のラッパーであるためです。何らかの方法でLoggingAspectを最初のラッパーに設定することができるので、AOPロギングとSpringキャッシュの両方を使用できるようになりますか?

+0

これをご覧くださいhttp://stackoverflow.com/questions/39047520/how-to-make-spring-cacheable-work-on-top-of-aspectj-aspect – reos

答えて

2

だけhere続きを読む春順序インターフェースおよびgetOrder()メソッドの戻り値に1

@Aspect 
@Component 
public class LoggingAspect implements Ordered { 
    @Around("within(@com.mk.cache.LoggedIO *) && execution(* *(..))") 
    public Object logAroundPublicMethod(ProceedingJoinPoint joinPoint) throws Throwable { 
     String wrappedClassName = joinPoint.getSignature().getDeclaringTypeName(); 
     Logger LOGGER = LoggerFactory.getLogger(wrappedClassName); 
     String methodName = joinPoint.getSignature().getName(); 
    LOGGER.info("LOG by AOP - invoking {}({})", methodName, Arrays.toString(joinPoint.getArgs())); 
    Object result = joinPoint.proceed(); 
    LOGGER.info("LOG by AOP - result of {}={}", methodName, result); 
     return result; 
    } 

    @Override 
    public int getOrder() { 
     return 1; 
    } 

} 

を実装します。第11.2.7

関連する問題