spring-boot AOP 통합 처리 로그 사용
8570 단어 springbootAOP로그
[개발 환경: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()));
}
}
이상,모두 본인 의 테스트 결과 에 차이 가 있 거나 오류 가 있 을 수 있 습 니 다.지적 을 환영 합 니 다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin Springboot -- 파트 14 사용 사례 REST로 전환하여 POST로 JSON으로 전환前回 前回 前回 記事 の は は で で で で で で を 使っ 使っ 使っ て て て て て リクエスト を を 受け取り 、 reqeustbody で 、 その リクエスト の ボディ ボディ を を 受け取り 、 関数 内部 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.