spring-boot AOP 통합 처리 로그 사용

8570 단어 springbootAOP로그
AOP 는 우리 가 요청 로 그 를 처리 하거나 어떤 방법 에 대해 감 시 를 해 야 할 때 가 있다 는 것 을 잘 알 고 있다 고 생각 합 니 다.만약 예외 상황 이 발생 하면 어떻게 처리 해 야 하 는 지,지금 우 리 는 spring-boot 에서 AOP 를 도입 합 니 다.
[개발 환경:jdk 버 전 번호 1.8,spring
boot 버 전 번 호 는 1.4.1]{style="background-color:\#FF 0000"}
우선,우 리 는 먼저 jar 가방 을 도입 합 니 다.
POM 파일 은 다음 과 같은 내용 을 추가 합 니 다.

<!--  AOP-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!--  GSON,    -->
<dependency>
  <groupId>com.google.code.gson</groupId>
  <artifactId>gson</artifactId>
  <version>2.7</version>
</dependency>
jar 패 키 지 를 도입 한 후,우 리 는 boot 의 시작 방법 에 두 가지 간단 한 요청 처리 방법 을 추가 합 니 다.

@SpringBootApplication(scanBasePackages = {"com"})
@RestController
public class DemoApplication{
  public static void main(String[] args) {
   SpringApplication.run(DemoApplication.class, args);
  }
  //     get  
  @RequestMapping(value = "/testAspect",method = RequestMethod.GET)
  public UserVo test(){
   UserVo userVo = new UserVo();
   userVo.setAge("23");
   userVo.setName("   ");
   userVo.setSex(" ");
   return userVo;
  }
  //     get  , aop      
  @RequestMapping(value = "/testAspectArgs",method = RequestMethod.GET)
  public UserVo test(String name,String age,String sex){
   UserVo userVo = new UserVo();
   userVo.setName(name);
   userVo.setAge(age);
   userVo.setSex(sex);
   return userVo;
  }
간단 한 처리 요청 방법 두 가 지 를 추가 한 후,우 리 는 우리 의 op 을 증가 시 킵 니 다.

/**
 *    :SpringBootDemo
 *    :   
 *     :16/12/4   7:05
 *   :AspectDemo
 *    :
 */
//      
@Aspect
//    spring   bean
@Component
@Order(1)
public class AspectDemo {
  private Logger log = Logger.getLogger(getClass());
  private Gson gson = new Gson();
  //           execution   
  @Pointcut("execution(public * com.example.DemoApplication.*(..))")
  private void controllerAspect(){}
  //  method     
  @Before(value = "controllerAspect()")
  public void methodBefore(JoinPoint joinPoint){
   ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
   HttpServletRequest request = requestAttributes.getRequest();
   //      
   log.info("===============    ===============");
   log.info("    :"+request.getRequestURL().toString());
   log.info("    :"+request.getMethod());
   log.info("     :"+joinPoint.getSignature());
   log.info("       :"+ Arrays.toString(joinPoint.getArgs()));
   log.info("===============    ===============");
  }
  //              
  @AfterReturning(returning = "o",pointcut = "controllerAspect()")
  public void methodAfterReturing(Object o ){
   log.info("--------------    ----------------");
   log.info("Response  :"+gson.toJson(o));
   log.info("--------------    ----------------");
  }
두 가 지 를 설정 한 후에 우 리 는 인쇄 로 그 를 볼 것 을 요청 합 니 다.먼저,우리 의 용 기 를 시작 한 다음 에 우 리 는 먼저 처리 요청 방법 을 요청 합 니 다.인쇄 로 그 는 다음 과 같 습 니 다.

{width=”1232”
height=”132”}
요청 한 url,method,args 매개 변수의 값,그리고 유형,그리고 돌아 오 는 내용 이 모두 인쇄 되 었 음 을 알 수 있 습 니 다.이것 은 AOP 차단 에 성공 했다 는 것 을 설명 합 니 다.
다음은 요청 에 참여 하지 않 은 처리 요청 방법 을 테스트 해 보 겠 습 니 다.인쇄 로 그 는 다음 과 같 습 니 다.

{width=”1100”
height=”130”}
우 리 는 이 방법 을 발견 할 수 있 습 니 다.인쇄 방법 인 자 는 빈 배열 입 니 다.방법 은 매개 변수 전달 이 필요 하지 않 기 때 문 입 니 다.
이상 은 springboot 가 op 을 인용 하여 웹 로그 처 리 를 하 는 것 입 니 다.다음은 AOP 절단면 의 주요 몇 가지 주 해 를 추가 할 것 입 니 다.다음은 주석 에 대한 설명 과 사용 일 뿐 구체 적 인 테스트 는 작 가 는 테스트 를 하지 않 습 니 다.여러분 이 관심 이 있 으 면 직접 테스트 해 보 세 요.
클래스 설명:
@Aspect 는 하나의 종 류 를 절단면 류 로 정의 합 니 다.
@order(i)는 절단면 류 의 처리 우선 순 위 를 표시 합 니 다.i 값 이 작 을 수록 우선 순위 가 높 습 니 다.PS:클래스 를 주석 할 수도 있 고 방법 에 주석 할 수도 있 습 니 다.
방법 설명:
@Pointcut 은 절 점 안의 내용 을 표현 식 으로 정의 합 니 다.자세 한 내용 은 다음 과 같 습 니 다.
@Before 절 점 전에 방법 을 실행 합 니 다.내용 은 지정 한 절 점 입 니 다.
@After 절 점 후 return 전에 실행,
@AfterReturning 은 접점,return 후 실 행 됩 니 다.어떤 방법의 반환 매개 변 수 를 처리 하려 면 이 동작 을 할 수 있 습 니 다.
@Around 서 라운드 접점,접점 에 들 어가 기 전에 접점 을 따라 실행 합 니 다.
@AfterThrowing 은 접점 후 이상 을 던 져 처리 합 니 다.
@order(i)접점 의 우선 순 위 를 표시 합 니 다.i 가 작 을 수록 우선 순위 가 높 습 니 다.
@Pointcut 주석 조합 사용:
위의 코드 에서 우 리 는 하나의 절 점 을 정 의 했 습 니 다.이 절 점 은 지정 한 경로 만 처리 합 니 다.

@Pointcut("execution(public * com.example.DemoApplication.*(..))")
private void controllerAspect(){}
현재,우 리 는 다른 경 로 를 처리 하 는 절 점 을 정의 하고 있 습 니 다.

@Pointcut("execution(public * com.demo.*.*(..))")
private void controllerDemo(){}
상기 절 점 은 모두 서로 다른 내용 을 처리 하 는 것 입 니 다.만약 에 우리 가 그들 두 가 지 를 처리 할 절 점 이 필요 하 다 면 우 리 는 이렇게 설정 할 수 있 습 니 다.

@Pointcut(value = "controllerAspect()||controllerDemo()")
private void all(){}
@Pointcut 주해 에서@Pointcut 에 의 해 주 해 된 다른 방법 이름 을 직접 참조 하면 이 절 점 은 두 경로 의 방법 을 처리 할 수 있 습 니 다.
@Pointcut 주석 에 있 는 execution 표현 식:public*com.demo.*.*(..)
첫 번 째 Public 표시 방법의 수식 자 는*로 대체 할 수 있 습 니 다.
첫 번 째*는 반환 값 을 표시 하고*는 모든 것 을 대표 합 니 다.
com.demo.*패키지 경로,.*경로 의 모든 패키지 표시
세 번 째.*경로 에서 모든 가방 에 있 는 모든 종류의 방법 을 표시 합 니 다.
(..)무제 한 방법 매개 변수 표시
@order(i)주석 에 대한 주의사항:
주해 류,i 값 은,값 이 작 을 수록 우선 순위 가 높 습 니 다.
주해 방법 은 두 가지 상황 으로 나 뉜 다.
주 해 는@Before 가 i 값 이 작 을 수록 우선 순위 가 높 습 니 다.
주 해 는@After 또는@After Returning 에서 i 값 이 클 수록 우선 순위 가 높 습 니 다.
두 가 지 를 요약 하면 다음 과 같다.
접점 앞 에 있 는 작업 은 order 의 값 에 따라 작은 것 에서 큰 것 으로 실 행 됩 니 다.
절 입 점 후의 작업 은 order 의 값 에 따라 큰 것 에서 작은 것 으로 실 행 됩 니 다.
연장:
만약 에 제 가 요청 을 인쇄 하려 면 들 어 오 는 것 부터 끝 날 때 까지 필요 한 시간,구성원 변 수 를 정의 하여 시간 을 통계 하 는 동시에@Before 와@AfterReturning 에 접근 하려 면 동기 화 된 문제 가 있 을 수 있 습 니 다.그래서 저 희 는 ThreadLocal 에서 지정 한 일반적인 대상 을 참조 하여@Before 에서 요청 한 시간 을 기록 하고@AfterReturning 에서 기록 을 공제 하 는 시간 은 소 모 된 시간 입 니 다.코드 는 다음 과 같 습 니 다:

/**
 *    :SpringBootDemo
 *    :   
 *     :16/12/4   7:05
 *   :AspectDemo
 *    :
 */
//      
@Aspect
//    spring   bean
@Component
@Order(1)
public class AspectDemo {
  private Logger log = Logger.getLogger(getClass());
  private Gson gson = new Gson();
  ThreadLocal<Long> startTime = new ThreadLocal<Long>();
  //           execution   
  @Pointcut("execution(public * com.example.DemoApplication.*(..))")
  private void controllerAspect() {
  }
  //  method     
  @Before(value = "controllerAspect()")
  public void methodBefore(JoinPoint joinPoint) {
   startTime.set(System.currentTimeMillis());
   ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
   HttpServletRequest request = requestAttributes.getRequest();
   //      
   log.info("===============    ===============");
   log.info("    :" + request.getRequestURL().toString());
   log.info("    :" + request.getMethod());
   log.info("     :" + joinPoint.getSignature());
   log.info("       :" + Arrays.toString(joinPoint.getArgs()));
   log.info("===============    ===============");
  }
  //              
  @AfterReturning(returning = "o", pointcut = "controllerAspect()")
  public void methodAfterReturing(Object o) {
   log.info("--------------    ----------------");
   log.info("Response  :" + gson.toJson(o));
   log.info("--------------    ----------------");
   log.info("       :"+(System.currentTimeMillis() - startTime.get()));
  }
}
이상,모두 본인 의 테스트 결과 에 차이 가 있 거나 오류 가 있 을 수 있 습 니 다.지적 을 환영 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기